39

テーブルの列に次のような 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 は属性がノードの一部である必要があることを通知します。子ノードの属性を選択するための多くの例を見つけることができますが、兄弟の属性については何もありません (それが正しい用語である場合)。

どんな助けでも大歓迎です。

4

2 に答える 2

73

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

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

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

マルク

于 2009-10-13T15:47:50.127 に答える
10

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'
于 2009-10-13T22:39:01.393 に答える