テーブルの列に次の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は属性がノードの一部でなければならないことを示しています。子ノードの属性を選択する多くの例を見つけることができますが、兄弟属性には何もありません(それが正しい用語である場合)。
任意の助けをいただければ幸いです。
.value
の代わりに.query
関数を使用してみてください。
SELECT
xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)')
FROM
LogTable
XPath式はノードのリストを返す可能性があるため、[1]
をその潜在的なリストに追加して、これらのエントリの最初を使用するようにSQL Serverに指示する必要がありますベース)。 2番目のパラメーターとして、値をどのタイプに変換するかを指定する必要があります-ここで推測するだけです。
マーク
実際の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'