2016-04-29 60 views
4
DECLARE @TablesList TABLE 
(
    TableName VARCHAR(500), 
    RefTable VARCHAR(500), 
    RefTableIDColumn VARCHAR(500) 
) 
DECLARE @Query AS VARCHAR(MAX) 


SET @Query = 'DECLARE @badIds AS VARCHAR(500) DECLARE @TableXML AS XML' 
SET @Query = @Query + ' SELECT @TableXML = xCol FROM (SELECT * FROM OPENROWSET (BULK ''\\10.0.0.60\Temp\path\DataItemTables.xml'', SINGLE_CLOB)AS xCol) AS R(xCol)' 
SET @Query = @Query + ' INSERT INTO @TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,' 
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM' 
SET @Query = @Query + ' @TableXML.nodes(''//Table[@name="Description"]'') AS R(ref)' 
SET @Query = @Query +'select * from @TablesList' 

EXEC(@Query) 

我正在執行上述腳本。但我得到如下錯誤從sql服務器中的XML文件中提取XML數據時出錯

Msg 1087, Level 15, State 2, Line 1 
Must declare the table variable "@TablesList". 
Msg 1087, Level 15, State 2, Line 1 
Must declare the table variable "@TablesList". 

我做錯了什麼。但是當我用下面的動態形式編寫查詢時,它可以正常工作。問題是我想刪除SP的所有動態部分。

DECLARE @Query AS VARCHAR(MAX) 

SET @Query ='DECLARE @TablesList TABLE (TableName VARCHAR(500),RefTable VARCHAR(500),RefTableIDColumn VARCHAR(500))' 
SET @Query = @Query + ' DECLARE @badIds AS VARCHAR(500) DECLARE @TableXML AS XML' 
SET @Query = @Query + ' SELECT @TableXML = xCol FROM (SELECT * FROM OPENROWSET (BULK ''\\10.0.0.60\Temp\Path\DataItemTables.xml'', SINGLE_CLOB)AS xCol) AS R(xCol)' 
SET @Query = @Query + ' INSERT INTO @TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,' 
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM' 
SET @Query = @Query + ' @TableXML.nodes(''//Table[@name="Description"]'') AS R(ref)' 
SET @Query = @Query +'select * from @TablesList' 

EXEC(@Query) 

回答

4

您只能在聲明它的同一範圍內訪問表變量。由於您的EXEC位於不同的作用域中,因此無法識別表變量。解決此問題的一種方法是使用臨時表代替:

CREATE TABLE #TablesList 
(
    TableName VARCHAR(500), 
    RefTable VARCHAR(500), 
    RefTableIDColumn VARCHAR(500) 
) 
DECLARE @Query AS VARCHAR(MAX) 

SET @Query = 'DECLARE @badIds AS VARCHAR(500) DECLARE @TableXML AS XML' 
SET @Query = @Query + ' SELECT @TableXML = xCol FROM (SELECT * FROM OPENROWSET (BULK ''\\10.0.0.60\Temp\path\DataItemTables.xml'', SINGLE_CLOB)AS xCol) AS R(xCol)' 
SET @Query = @Query + ' INSERT INTO #TablesList SELECT ref.value(''tablename[1]'',''nvarchar(500)'') AS tablename,' 
SET @Query = @Query + ' ref.value(''refTable[1]'',''nvarchar(500)'') AS refTable, ref.value(''refTableIDColumn[1]'',''nvarchar(500)'') AS refTableIDColumn FROM' 
SET @Query = @Query + ' @TableXML.nodes(''//Table[@name="Description"]'') AS R(ref)' 
SET @Query = @Query +'select * from #TablesList' 

EXEC(@Query) 
+0

它的工作,謝謝。我可以使上述查詢更靜態而不是動態。 – user2998990

+1

當然,我會把它留給你作爲練習。 –

+0

@ user2998990你有任何理由使用動態SQL嗎?如果您將'EXEC(@Query)'更改爲''SELECT @ Query',那麼您將得到查詢的文本而不需要很多工作,只需要一些格式化。不要忘記將輸出的文本長度設置爲8192(最大值),否則SSMS將不會顯示整個區域... – Shnugo

相關問題