Sql server 动态SQL赢了';不执行
以下是运行正常的原始SQL语句:Sql server 动态SQL赢了';不执行,sql-server,tsql,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 N
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,第15级,第2状态,第26行
必须声明表变量“@MasterTable” 味精137,15级,状态2,第26行
必须声明标量变量“@Client”
动态sql在它自己的批处理中运行,因此它不会识别调用它的脚本中声明的变量 您可以按如下方式将变量传递给动态sql:
declare @parmdefinition nvarchar(500);
set @parmdefinition = N'@Client char(10), @GroupCode nvarchar(20)';
EXEC sp_executesql @strSQL, @parmdefinition, @Client=@Client, @GroupCode=@GroupCode;
SET @strSQL = N'INSERT INTO ' + @MasterTable + ' ' + @strColumn + N' EXEC ' + @strProc
正如Laeeq的回答中提到的,为了填充表格,您必须使用临时表格(#MasterTable
)而不是表格变量
如果@MasterTable仅保留表名,则将其替换到前面的字符串中,如下所示:
declare @parmdefinition nvarchar(500);
set @parmdefinition = N'@Client char(10), @GroupCode nvarchar(20)';
EXEC sp_executesql @strSQL, @parmdefinition, @Client=@Client, @GroupCode=@GroupCode;
SET @strSQL = N'INSERT INTO ' + @MasterTable + ' ' + @strColumn + N' EXEC ' + @strProc
动态sql在它自己的批处理中运行,因此它不会识别调用它的脚本中声明的变量 您可以按如下方式将变量传递给动态sql:
declare @parmdefinition nvarchar(500);
set @parmdefinition = N'@Client char(10), @GroupCode nvarchar(20)';
EXEC sp_executesql @strSQL, @parmdefinition, @Client=@Client, @GroupCode=@GroupCode;
SET @strSQL = N'INSERT INTO ' + @MasterTable + ' ' + @strColumn + N' EXEC ' + @strProc
正如Laeeq的回答中提到的,为了填充表格,您必须使用临时表格(#MasterTable
)而不是表格变量
如果@MasterTable仅保留表名,则将其替换到前面的字符串中,如下所示:
declare @parmdefinition nvarchar(500);
set @parmdefinition = N'@Client char(10), @GroupCode nvarchar(20)';
EXEC sp_executesql @strSQL, @parmdefinition, @Client=@Client, @GroupCode=@GroupCode;
SET @strSQL = N'INSERT INTO ' + @MasterTable + ' ' + @strColumn + N' EXEC ' + @strProc
错误消息不是不言自明的吗?
@MasterTable
必须在动态sql语句的范围内声明。尝试在插入之前声明它。错误消息不是自解释的吗?@MasterTable
必须在动态sql语句的范围内声明。尝试在插入之前声明它。我已经完成了临时表,这解决了第一个问题。第二部分的工作。thxI已经完成了临时表,解决了第一个问题。第二部分的工作。谢谢