名称值对的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)
答
尝试查找在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
关闭,但我希望在选择字段中提供过滤功能,因为这将允许我准确控制返回的属性。 – Kyle 2012-08-08 14:24:37
我添加了where子句... – podiluska 2012-08-08 14:27:22
谢谢。我想我仍然没有解释我在找什么。 where子句将其限制为仅一个实体。我特别试图在xquery中进行过滤,以便可以使用已知的属性名称来区别该字段。我猜这更多的是一个xquery问题。感谢您的帮助,您的回答给了我更多想法来思考。 – Kyle 2012-08-08 14:31:57