Sql server 名称-值对的SQL XML查询?

Sql server 名称-值对的SQL XML查询?,sql-server,xml,Sql Server,Xml,首先,我要指出,在XML中使用nvp并不是我的选择,它正在被修改。也就是说,我有一个表,其中包含一个XML列,该列具有以下XML: <root> <results> <result name='First Result'> <property name='Property1' value='Value1' /> <property name='Property2' value='Value2' />

首先,我要指出,在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,
  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*”


我知道我走的是正确的道路,但我不太确定我到底应该做什么。有人能给我指出正确的方向吗?

这就是你要找的吗

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','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'   


尝试查找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]
查找第一个结果。

尝试查找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]
查找第一个结果。

关闭,但我希望在选择的字段中提供筛选,因为这将允许我精确控制要返回的属性。谢谢。我想我还是没有很好地解释我在寻找什么。where子句将其仅限于一个实体。我特别尝试在xquery中进行过滤,这样我就可以用已知的属性名对字段进行别名。我想这更像是一个xquery问题。谢谢你的帮助,你的回答让我有了更多的想法。我想你可能想要的是
sql:variable()
语法?这正是我想要的!每次我尝试使用
/property
而不是
/property
,但这就解决了问题!非常感谢。请关闭,但我希望在“选择”字段中提供筛选,因为这将允许我准确控制要返回的属性。谢谢。我想我还是没有很好地解释我在寻找什么。where子句将其仅限于一个实体。我特别尝试在xquery中进行过滤,这样我就可以用已知的属性名对字段进行别名。我想这更像是一个xquery问题。谢谢你的帮助,你的回答让我有了更多的想法。我想你可能想要的是
sql:variable()
语法?这正是我想要的!每次我尝试使用
/property
而不是
/property
,但这就解决了问题!非常感谢。我尝试了查询,但属性字段的值为NULL。这给了我一些关于尝试的想法。谢谢。我尝试了查询,但属性字段的值为NULL。这让我对需要尝试的事情有了更多的想法。