2016-09-08 4 views
0
set @xml = ' 
<body> 
    <Record> 
     <A>a</A> 
     <B>b</B> 
     <C>c</C> 
    </Record> 
    <Record> 
     <A>d</A> 
     <B>e</B> 
     <C>f</C> 
    </Record> 
    <Record> 
     <A>g</A> 
     <B>h</B> 
     <C>i</C> 
    </Record> 
</body> 
' 

私はこの構文を使用しようとしているが、のXQueryのXPathで変数を使用する(値)

は、私は、XQueryでXPathで変数を使用したい動作しません(値)

SET @xmlQuery = '/Record[2]/A' 

set @nodevalue = (@xml.value('(//*[local-name()=sql:variable("@xmlQuery")])/text())[1]', 'nvarchar(50)')) 

何が間違っていますか?

+0

...これは、標準で定義されている実際の/正当な言語ではなく、MicrosoftのXQueryの悲惨さのようなものですか? (特定のベンダーの実装に依存することを求めている場合は、適切なタグを付けてください)。 –

+0

... XQueryの変数は '@ foo'ではなく' $ foo'のような名前を持ち、変数を定義する構文は 'set'ではなく' declare'を使い、 'nvarchar'は有効なデータではありませんそこにタイプしてください。つまり、XQueryのようには見えません。 –

+0

実際に@xmlQueryの値はテーブルから来ます。私は動的SQLを使用して達成することができますが、私はどのようにexec sp_executesqlから来る値を割り当てるか分からないことを知っている。 http://stackoverflow.com/questions/39399317/save-result-of-exec-sp-excutequery-using-xpath – zanza67

答えて

0

SQL Server XMLには動的パス機能はありません。あなたのパスは、文字列全体として来て、あなたはパーサを書きたくない場合は

declare @xml xml; 

declare @Node1 sysname = N'Record', @Node2 sysname = N'A', @Node1Number int = 2; 

set @xml = '<body> 
    <Record> 
     <A>a</A> 
     <B>b</B> 
     <C>c</C> 
    </Record> 
    <Record> 
     <A>d</A> 
     <B>e</B> 
     <C>f</C> 
    </Record> 
    <Record> 
     <A>g</A> 
     <B>h</B> 
     <C>i</C> 
    </Record> 
</body>'; 

select @xml.value('(/body/ 
*[local-name() = sql:variable("@Node1") and position() = sql:variable("@Node1Number")]/ 
*[local-name() = sql:variable("@Node2")]/ 
text())[1]', 'nvarchar(50)'); 

しかし、唯一のオプションがある:あなたのオプションは

スプリットのような別の成分にパスされています動的SQL:

declare @Path nvarchar(max) = N'/body/Record[2]/A', @Sql nvarchar(max); 

set @Sql = N'select t.c.value(''./text()[1]'', ''nvarchar(50)'') from @xml.nodes(' 
+ quotename(@Path, '''') 
+ ') t(c);' 

exec sys.sp_executesql @Sql, N'@xml xml', @xml = @xml; 

私は個人的にはどちらも好きではなく、タスク全体を再考することをお勧めします。データベース側でXMLを動的にクエリするよりも優れたソリューションが存在する可能性があります。

+0

Roger、私はSQLの緑色のbeanですので、より良い解決策を提案してもらえますか? – zanza67

+0

@ zanza67、私はより良い解決策がSQLの外にあるべきである(おそらく)ことを意味します。しかし、そのようなソリューションが存在するかどうかは、タスクの詳細によって異なります。 –

関連する問題