2016-05-02 11 views
0

以下は実行しているクエリです。 @XMLdataパラメータのC#からXML入力を取得しています。SQLサーバーのXMLエラー

CREATE TABLE #TablesList 
(
    TableName VARCHAR(500), 
    RefTable VARCHAR(500), 
    RefTableIDColumn VARCHAR(500) 
) 


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 + @XMLdata+'.nodes(''//Table[@name="'[email protected]+'"]'') AS R(ref)' 
EXEC(@Query) 

私はクエリを実行すると、次のエラーが表示されます。エラーが

The data types varchar(max) and xml are incompatible in the add operator. 
+0

'Query'と' @のXMLdata' @のデータ型は何ですか? – Adwaenyth

+0

それぞれvarchar(max)とXML – user2998990

+0

'XML'データ型を暗黙的に定義されていない' varchar'に変換しようとすると動作しません。構築されたクエリで 'XML'データ型として' XML'にアクセスする必要がある場合は、それを渡したり、選択したり、作成しようとしているクエリ内で構築する必要があります。 – Adwaenyth

答えて

2

代わりにあなたの動的SQL文字列に@XMLdataの内容を注入する第二の最後の行のためである、sp_executesqlにパラメータとして@XMLdataを渡ししよう:に投稿された

..... 
SET @Query = @Query + '@XMLdata.nodes(''//Table[@name="'[email protected]+'"]'') AS R(ref)' 
EXEC sp_executesql @Query, N'@XMLdata XML', @XMLdata 

限り、動的SQLをあなたは動的SQLを完全に使用することを避けることができます。動的SQLの唯一の「動的」の部分は次のように、sql:variable()を使って気軽に扱うことができ@DataItem変数の値から来ている:

INSERT INTO #TablesList 
SELECT 
    ref.value('tablename[1]','nvarchar(500)') AS tablename, 
    ref.value('refTable[1]','nvarchar(500)') AS refTable, 
    ref.value('refTableIDColumn[1]','nvarchar(500)') AS refTableIDColumn 
FROM @XMLdata.nodes('//Table[@name=sql:variable("@DataItem")]') AS R(ref) 
+1

私はあなたが正しい方向(私の側から+1)の魔法のガラス球を指していると思うが、私の質問は、なぜ動的SQLと 'sp_executesql'の必要があるのだろうか? – Shnugo

+0

@ Shnugoそうです。 OPが投稿したSQLは、動的SQLなしでも実行できます(この点を含めるために私の答えが更新されました)。たぶん、動的なSQLの一部が問題になっていて、*彼*がそのルートに行くことを強制されました。確信が持てません.... – har07

+0

あなたは天才です... – user2998990

関連する問題