Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 动态SQL赢了';不执行_Sql Server_Tsql - Fatal编程技术网

Sql server 动态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

以下是运行正常的原始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,第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已经完成了临时表,解决了第一个问题。第二部分的工作。谢谢