3

我需要从 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 *'
4

2 回答 2

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
于 2014-11-18T08:13:31.843 回答
2

我遇到了一个与从 T-SQL XML 中提取值相关的问题,并发现了一个可能对其他人有帮助的问题。检索数据时: . value('(/root/subnode)[1]', 'varchar(max)')该调用不会检索数据,但以下调用会:.value('(//subnode)[1]', 'varchar(max)')。请注意,工作版本用 / 替换了根节点。第一次调用的问题似乎是根节点带有一个 xml 命名空间的规范,例如&< root xmlns="http://www..." &>,为了让 .value 调用返回数据,我需要通过命名空间的规范,这导致一些事情失败原因。

于 2015-03-31T18:27:49.073 回答