sql-server - 使用 sp_executesql 传递多个参数
问题描述
我正在使用 SQL Server 2016 编写具有动态 SQL 和sp_executesql
多个参数的存储过程。
CREATE PROCEDURE [dbo].[testsp] @ProductName nvarchar(250), @ProductDescription nvarchar(250)
AS
DECLARE @query NVARCHAR(MAX)
SET @query = 'EXEC (''INSERT INTO [dbo].[Products] ([ProductName], [ProductDescription]) VALUES (?,?)'', @ProductName, @ProductDescription) AT [linkedserver]'
EXEC sp_executesql @sql, N'@ProductName nvarchar(250), @ProductDescription nvarchar(250)', @ProductName, @ProductName;
错误:必须将参数号 2 和后续参数作为“@name = value”传递。使用“@name = value”形式后,所有后续参数必须以“@name = value”形式传递
我需要对存储过程进行 jdbc 调用。
call [dbo].[testsp](?,?)
解决方案
如果我对这个问题的理解正确,则需要按照以下方式定义存储过程才能使用EXECUTE .. AT
(使用?
语法)。请注意,这[linkedserver]
必须引用本地服务器中现有的链接服务器定义。
CREATE PROCEDURE [dbo].[testsp]
@ProductName nvarchar(250),
@ProductDescription nvarchar(250)
AS
BEGIN
EXEC sp_addlinkedserver 'linkedserver', 'SQL Server'
DECLARE @err int
EXECUTE (
N'INSERT INTO [dbo].[Products] ([ProductName], [ProductDescription]) VALUES (?, ?)',
@ProductName, @ProductDescription
) AT [linkedserver]
SELECT @err = @@ERROR
RETURN @err
END
如果要使用sp_executesql
,则需要使用以下语句创建存储过程:
CREATE PROCEDURE [dbo].[testsp]
@ProductName nvarchar(250),
@ProductDescription nvarchar(250)
AS
BEGIN
EXEC sp_addlinkedserver 'linkedserver', 'SQL Server'
DECLARE @sql NVARCHAR(MAX)
DECLARE @err int
SET @sql =
'INSERT INTO [dbo].[Products] ([ProductName], [ProductDescription]) '+
'VALUES (@ProductName, @ProductName)'
EXEC @err = [linkedserver]...sp_executesql
@sql,
N'@ProductName nvarchar(250), @ProductDescription nvarchar(250)',
@ProductName, @ProductName;
RETURN @err
END
作为附加说明,在这种情况下您不需要混合EXECUTE和sp_executesql 。选择这两种方法之一。
推荐阅读
- python - Have I created the mergesort algorithm
- nativescript - 如何访问 nativescript 页面组件的 isLoaded 属性?
- c++ - c++ 转换运算符重载失败
- json - Elixir - 将 http 响应 json 转换为 ecto.schema 对象
- r - ggplot2 使用 facetwrap 和多个变量
- javascript - 在 onClick 处理程序中传递参数的最有效方法
- c# - 如何在 c# 中通过 linq 仅从日期时间获取日期?
- ios - 无法预览此文件 - [App name] 可能已崩溃 SWIFTUI XCODE11
- wso2 - 通过管理控制台批量删除身份服务器中的用户
- javascript - Cystoscape 超出画布边框