以下是运行没有问题的原始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"。
答案 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