2017-02-23 40 views
0

這裏是沒有問題的運行原來的SQL語句:動態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 

下面是我收到的錯誤:

消息1087,級別15,狀態2,行26
必須聲明表變量「@MasterTable」。

消息137,級別15,狀態2,行26
必須聲明標量變量「@Client」。

+0

不是錯誤信息不言自明? –

+1

必須在動態sql語句的範圍內聲明'@ MasterTable'。嘗試在'INSERT'之前聲明它。 –

回答

2

動態sql在它自己的批處理中運行 - 因此它不會識別在調用它的腳本中聲明的變量。

您可以通過變量動態SQL如下:

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

正如Laeeq的答覆中提到 - 爲了填充表,你將不得不使用臨時表(#MasterTable),而不是一個表變量。

如果@MasterTable只是持有該表的名稱,然後替補多入串較早如下:

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

我已經完成臨時表並解決了第一個問題。在第二部分工作。 thx –

+0

這工作。感謝所有的建議 –