首页 > 解决方案 > 使用 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](?,?)

标签: sql-serverjdbcsp-executesql

解决方案


如果我对这个问题的理解正确,则需要按照以下方式定义存储过程才能使用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

作为附加说明,在这种情况下您不需要混合EXECUTEsp_executesql 。选择这两种方法之一。


推荐阅读