2016-04-29 3 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データを補間する際のエラー

私は間違っています。しかし、私は以下のような動的な形式でクエリを書くとき、それは正常に動作します。問題は、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のスコープが異なるため、テーブル変数は認識されません。これを解決する1つの方法は、代わりにテンポラリテーブルを使用することです。

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

関連する問題