我需要从XML文档中选择值。这些值存储为子节点,如下所示:
<customers>
<customer>
<kunnr>1</kunnr>
<kdgrp>2</kdgrp>
</customer>
<customer>
<kunnr>2</kunnr>
<kdgrp>2</kdgrp>
</customer>
</customers>
我需要为每个客户节点选择kunnr和kdgrp的值。我期待这样的结果:
kunnr kdgrp
1 2
2 2
到目前为止我尝试了什么:
SELECT @xml.query('/customers/customer/kunnr') AS KUNNR,
@xml.query('/customers/customer/kdgrp') AS KDGRP
这导致一行包含两个包含XML的列:
KUNNR KDGRP
<kunnr>1</kunnr><kunnr>2</kunnr> <kdgrp>2</kdgrp><kdgrp>2</kdgrp>
另一次尝试:
SELECT C.value('/kunnr/text()','nvarchar(10)') as KUNNR,
C.value('/kdgrp/text()','nvarchar(10)') as KDGRP
from @xml.nodes('/customers/customer') AS T(C);
这导致以下错误消息:
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
答案 0 :(得分:5)
也许是这样的:
DECLARE @xml XML
SET @xml='<customers>
<customer>
<kunnr>1</kunnr>
<kdgrp>2</kdgrp>
</customer>
<customer>
<kunnr>2</kunnr>
<kdgrp>2</kdgrp>
</customer>
</customers>'
然后是这样的查询:
SELECT
c.value('kunnr[1]', 'nvarchar(10)') AS kunnr,
c.value('kdgrp[1]', 'nvarchar(10)') AS kdgrp
FROM
@xml.nodes('//customers/customer') as t(c)
这会给你这个结果:
kunnr kdgrp
1 2
2 2
答案 1 :(得分:2)
我遇到了与从T-SQL XML中提取值相关的问题,并发现了一个可能对其他人有帮助的问题。使用以下内容检索数据时:。value('(/root/subnode)[1]', 'varchar(max)')
该调用无法检索数据,但后续调用执行了:.value('(//subnode)[1]', 'varchar(max)')
。请注意,工作版本用/替换了根节点。第一次调用的问题似乎是根节点带有像&< root xmlns="http://www..." &>
这样的xml命名空间的规范,并且获取.value调用以返回我需要的数据,以便超过导致命名空间的命名空间的规范因某些原因失败的事情。