2016-04-28 21 views
2

SQLクエリで使用するためには、特定のXML要素の値を取得する必要があります。 XML要素は、その属性によって指定されます。SQL Server:属性を指定するXML要素の値を取得する方法は?

<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations> 

と私は「EN-US」であることをLANGを指定したとき、私は探しています値は、「例」のようになります。

私のXML要素は次のようになります。

私はquery()関数とそれ以降value()関数を使用してこの値を取得する方法を見つけました。

declare @S varchar(max) 

set @S = 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>' 

declare @X xml 

set @X = CAST(@S as xml) 

select @X.query('/translations/value[@lang="en-US"]').value('.','varchar(max)') 

このselect文は、query()およびvalue()関数を使用して探している値 "example"を返します。しかし、value()またはquery()だけを使用するより便利な方法もありますか?

ありがとうございます!

答えて

1

あることを確認...

また、宣言を短縮することができます。

declare @X xml= 
'<translations> 
    <value lang="en-US">example</value> 
    <value lang="de-DE">Beispiel</value> 
</translations>'; 

select @X.value('(/translations/value[@lang="en-US"])[1]','varchar(max)'); 

ポイントは、あなたが.value()を使用しているときにシングルトン結果を必要とすること、です。これを達成するには、XPathを小文字にして、最初の要素を強制的に取得します(この場合、唯一の要素です)。

ところで:あなたはこれを必要とする場合(および遅かれ早かれ、あなたは、これが...必要になります)、あなたはこのようなあなたのクエリにパラメータとして「EN-US」を置くかもしれません:

declare @prm VARCHAR(10)='en_US'; 
select @X.value('(/translations/value[@lang=sql:variable("@prm")])[1]','varchar(max)'); 

することができますが同様の値に到達しますが、実際のクエリの値はsql:column()です。

+0

ありがとうございました!それは私にとって大きな改善です! – bert

関連する問題