web-dev-qa-db-ja.com

SQL ServerのXML要素から特定の属性を取得する方法

テーブルの列に次のXMLのようなものがあります。

<?xml version="1.0" encoding="utf-8"?>
<container>
  <param name="paramA" value="valueA" />
  <param name="paramB" value="valueB" />
  ...
</container>

TSQLを介してXMLからvalueB部分を取得しようとしています。

これまでのところ、正しいノードを取得していますが、属性を取得する方法がわかりません。

select xmlCol.query('/container/param[@name="paramB"]') from LogTable

最後に/ @ valueを追加するだけでよいと考えていますが、SQLは属性がノードの一部でなければならないことを示しています。子ノードの属性を選択する多くの例を見つけることができますが、兄弟属性には何もありません(それが正しい用語である場合)。

任意の助けをいただければ幸いです。

33
My Other Me

.valueの代わりに.query関数を使用してみてください。

SELECT 
  xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
FROM  
  LogTable

XPath式はノードのリストを返す可能性があるため、[1]をその潜在的なリストに追加して、これらのエントリの最初を使用するようにSQL Serverに指示する必要がありますベース)。 2番目のパラメーターとして、値をどのタイプに変換するかを指定する必要があります-ここで推測するだけです。

マーク

57
marc_s

実際のxmlの構造によっては、ビューを重ねて「通常の」SQLを使用して簡単に使用できるようにすることが役立つ場合があります。

CREATE VIEW vwLogTable
AS
SELECT
    c.p.value('@name', 'varchar(10)') name,
    c.p.value('@value', 'varchar(10)') value
FROM
    LogTable
    CROSS APPLY x.nodes('/container/param') c(p)
GO


-- now you can get all values for paramB as...
SELECT value FROM vwLogTable WHERE name = 'paramB'
6
user189459