2016-09-19 6 views
0

SQL Server内のXQuery演算内で相対パスを使用する簡単な方法はありますか?SQL XQuery算術内の相対パスの使用

以下のコードで、私は、オペレータの両側に/a/b/を繰り返しています:

declare @x xml = '<a><b><x>10</x><y>20</y></b></a>' 
select @x.value('((/a/b/x/text())[1] + (/a/b/y/text())[1])[1]','bigint') 

詳細

NB:私は例では、私はSUM関数を使用することができ、上記ことを承知しています。 ..悲しいことに、私の実際のユースケースには当てはまりません。そこでは、複数の要素があり、それらの間でさまざまな操作が実行されます。

私はまた、以下のような何かをするnodesオプションに精通してる:

select ab.b.value('((./x)[1] + (./y)[1])[1]','bigint') 
from @x.nodes('/a/b') ab(b) 

私もXMLではなく、カラムから来ているとき、このようなサブクエリをアクセスするためにouter apply/cross applyを使用して精通してい変数。それは現在私が取っているルートですが、それはちょっとした感じです。

私はこのようなソリューションを視覚化しています: select @x.value('(/a/b[(./x)[1] + (./y)[1]])[1]','bigint');フィルタが現在のパスのコンテキスト内の複数の要素にどのように適用されるかと同様に、それがどのように書かれているかは分かっていません(これも可能であると仮定して)。

答えて

1
declare @x xml 
SET @x = '<a><b><x>10</x><y>20</y></b></a>' 

select @x.query(' 
    for $i in /a/b 
    return 
     data($i/x[1]) + data($i/y[1]) 
') 

パスが長すぎて、別名を使用したい場合は、上記のオプションを使用できます。それは少し良く見えるかもしれませんか? - 、*などの他の演算子で+を置き換えることができます。 (SQLサーバー2005でテスト済み)

+0

偉大な解決策、君は – JohnLBevan

1
あなたは

'/a/b/(x+y)' 

'((/a/b/x/text())[1] + (/a/b/y/text())[1])[1]' 

を置き換えることができ、あなたのデータを与えられたほとんどのXQueryシステムで

、しかし、私は、これはあなたの場合には適用されない場合がありますので、SQLサーバーの実装は、独自の癖を持っていると信じて。悲観的なタイプのチェックを回避する方法が必要な場合は、

/a/b/sum((x,y)) 

を実行する可能性があります。

+0

ご回答ありがとうございます。悲しいことに、最初の解決策は 'Msg 9341、Level 16、State 1、Line 3を返します。 XQuery [value()]: '('、ステップ式が期待されています) 'の構文エラー、 'Msg 9335、Level 16 、状態1、行3 XQuery [value()]:XQueryの構文 '/ function()'はサポートされていません ' – JohnLBevan

+0

実際にはXPath 1.0に近いXQueryサブセットをサポートしているようですね –

関連する問題