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 回答