动态SQL不会执行

时间:2017-02-23 13:51:36

标签: sql-server tsql

以下是运行没有问题的原始SQL语句:

INSERT  INTO @MasterTable ( Col1 , Col2 , Col3 , Col4 , Col5 ,  Col6, Col7, Col8, Col9  ) 
EXEC Triage.Micro.DeptChanges @Client,@GroupCode, 0, @Ref1, @Ref2, @Ref3

当我尝试使用动态sql做同样的事情时,它会出错。我不知道如何解决它。以下是生成和运行动态SQL的代码:

DECLARE @strSQL NVARCHAR(MAX), @strColumn VARCHAR(MAX), @strProc VARCHAR( MAX)

SELECT  @strColumn = StoredProcName ,
        @strProc = SPROC
FROM    Triage..tblReports2FileName
WHERE   ReportCode = 'R005';

SET @strSQL = N'INSERT  INTO @MasterTable ' +  @strColumn + N' EXEC ' + @strProc

EXEC sp_executesql @strSQL

以下是我收到的错误:

  

Msg 1087,Level 15,State 2,Line 26   
必须声明表变量" @ MasterTable"。

     

Msg 137,Level 15,State 2,Line 26   
必须声明标量变量" @ Client"。

1 个答案:

答案 0 :(得分:3)

动态sql在它自己的批处理中运行 - 所以它不会识别调用它的脚本中声明的变量。

您可以按如下方式将变量传递给动态sql:

declare @parmdefinition nvarchar(500);
set @parmdefinition = N'@Client char(10), @GroupCode nvarchar(20)';
EXEC sp_executesql @strSQL, @parmdefinition, @Client=@Client, @GroupCode=@GroupCode;

正如Laeeq的回答中所提到的 - 为了填充表,你必须使用临时表(#MasterTable)而不是表变量。

如果@MasterTable只保存表的名称,则先将其替换为字符串,如下所示:

SET @strSQL = N'INSERT  INTO ' +  @MasterTable + ' ' +  @strColumn + N' EXEC ' + @strProc