名称值对的SQL XML查询?

问题描述:

首先,我会开始注意到,它不是我选择在XML中使用nvp,而是在修改过程中使用nvp。话虽这么说,我有一个包含具有以下XML的XML列的表:名称值对的SQL 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 [导致.xmlField.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' 

OR

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) 
+0

关闭,但我希望在选择字段中提供过滤功能,因为这将允许我准确控制返回的属性。 – Kyle 2012-08-08 14:24:37

+0

我添加了where子句... – podiluska 2012-08-08 14:27:22

+0

谢谢。我想我仍然没有解释我在找什么。 where子句将其限制为仅一个实体。我特别试图在xquery中进行过滤,以便可以使用已知的属性名称来区别该字段。我猜这更多的是一个xquery问题。感谢您的帮助,您的回答给了我更多想法来思考。 – Kyle 2012-08-08 14:31:57

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

+0

谢谢。我试过这个查询,但是我得到了NULL属性字段。这让我有更多的想法尝试。 – Kyle 2012-08-08 14:26:37