0

まず最初に、XML内でnvpを使用することは私の選択ではなく、変更の過程にあることに注意することから始めます。そうは言っても、次のxmlを持つXML列を含むテーブルがあります。

<root>
  <results>
    <result name='First Result'>
      <property name='Property1' value='Value1' />
      <property name='Property2' value='Value2' />
    </result>
  </results>
</root>

結果名を取得する次のクエリがあります。

SELECT
  T.N.value('@name', 'nvarchar(256)') AS resultName
FROM
  results CROSS APPLY xmlField.nodes('/root/results/result') AS T(N)

しかし、どうすればプロパティを表示できるかについては確信が持てません。私は次のことを試しました:

SELECT
  T.N.value('@name', 'nvarchar(256)') AS resultName,
  T.N.value('/property[@name="Property1"]/@value', 'nvarchar(256)') AS Property
FROM
  results CROSS APPLY xmlField.nodes('/root/results/result') AS T(N)

しかし、次のエラーが発生しました。

XQuery [results .xmlField.value()]:'value()'にはシングルトン(または空のシーケンス)が必要で、タイプ' xdt:untypedAtomic*'のオペランドが見つかりました

私は正しい道を進んでいることを知っていますが、正確に何をすべきかについてはまったく前向きではありません。誰かが私を正しい方向に向けることができるでしょうか?

4

2 に答える 2

3

これはあなたが求めているものですか?

SELECT 
  T.N.value('../@name','varchar(255)') as resultName,
  T.N.value('@name', 'nvarchar(256)') AS Propertyname ,
  T.N.value('@value', 'nvarchar(256)') as Value      
FROM 
    results
        cross apply
  xmlfield.nodes('/root/results/result/property') AS T(N) 
where
     T.N.value('@name', 'nvarchar(256)') ='property1'   

また

SELECT 
  T.N.value('@name', 'nvarchar(256)') AS resultName,
  T.N.value('(./property[@name="Property1"]/@value)[1]', 'nvarchar(256)') AS Property 
FROM 
  results CROSS APPLY xmlField.nodes('/root/results/result') AS T(N) 
于 2012-08-08T14:14:28.823 に答える
0

xpathで最初に一致するノードを検索してみてください。

SELECT   organizationDeviceId,   
         T.N.value('@name', 'nvarchar(256)') AS resultName,   
         T.N.value('(/property[@name="Property1"])[1]/@value', 'nvarchar(256)') AS Property
       FROM results CROSS APPLY xmlField.nodes('/root/results/result') AS T(N) 

結果について100%確信はありませんが[1]、最初の結果を検索するために使用する必要があります。

于 2012-08-08T14:16:07.273 に答える