1

我正在尝试使用sp_executesql但在另一个存储过程中调用存储过程(带有输出变量)。我写了以下内容,但仍然无法理解该错误的含义

这将从 web 服务代码中调用:

exec sp1 'obj1',@params 

这里objparamsnvarchar(max)

的定义sp1是:

Alter procedure [dbo].[sp1 ]  
    @procname nvarchar(max),  
    @params nvarchar(max)  
as   
    declare @temp varchar(15)  

    if @procname = 'obj1'  
    begin  
        set @params = @params +  ',@Newval  varchar(15) output'  
        EXEC sp_executesql @sp2,@params,@Newval=@temp OUTPUT  
    end  

的定义sp2

我在这里返回@Newval

我得到的错误:

消息 102,级别 15,状态 1,第 1 行
',' 附近的语法不正确。

同样在 2 中代替execstatement ,我尝试了以下操作:

 EXEC sp_executesql @sp2, @params, @temp OUTPUT; 

导致同样的错误。

set @sql='sp2,' + ' @params ' + ',@params,@temp OUTPUT'
EXEC sp_executesql (@sql)

也会导致同样的错误。

我需要在 sp1 中动态选择存储过程,params 是nvarchar(max)一串参数及其值,其中一些是 varchar 并以“值”格式嵌入,但这个字符串很好,因为我可以调用底层 sp2有了这个。

附加信息,它有帮助。

EXEC sp_executesql @sp2,@params,@Newval=@temp OUTPUT  

在此@params 中是最终 sp 的键和 vlaue 对的组合。像:
'@key1="a",@key2="b"'
等等,我无法预定义@params,但它是动态的,当我运行它时它工作正常

exec (@sql)     

格式,而整个名称,参数嵌入在@sql中

4

1 回答 1

0

如果@params=''NULL那么你的,之前@Newval是无关紧要的。我建议你检查:

IF NULLIF(@params,'') IS NULL or @params IS NULL
SET @params = '@Newval  varchar(15) output'
ELSE 
SET @params = @params + ',@Newval  varchar(15) output'

你正在通过@sp2也许你需要这个:

ALTER PROCEDURE [dbo].[sp1]  
    @procname nvarchar(max),  
    @params nvarchar(max)  
AS   
    DECLARE @temp varchar(15)

    IF @procname = 'obj1'  
    BEGIN  
        SET @params = @params +  ',@Newval  varchar(15) output'  
        EXEC sp_executesql N'EXEC sp2 @someparam1, @someparam2, @Newval varchar(15) OUTPUT', @params, @someparam1 = 1, @someparam2 = 2, @Newval=@temp OUTPUT  
    END  

编辑

工作示例:

USE [AdventureWorks]
GO

DECLARE @procname nvarchar(max) = 'EXEC [dbo].[uspGetWhereUsedProductID] @StartProductID, @CheckDate',  
        @params nvarchar(max) = '@StartProductID int, @CheckDate date'

EXEC sp_executesql @procname, @params, @StartProductID = 1, @CheckDate = '2015-10-17'
GO
于 2016-06-05T09:53:17.793 回答