Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL中的XML中选择值_Sql_Sql Server_Xml_Tsql_Child Nodes - Fatal编程技术网

从SQL中的XML中选择值

从SQL中的XML中选择值,sql,sql-server,xml,tsql,child-nodes,Sql,Sql Server,Xml,Tsql,Child Nodes,我需要从XML文档中选择值。这些值存储为子节点,如下所示: <customers> <customer> <kunnr>1</kunnr> <kdgrp>2</kdgrp> </customer> <customer> <kunnr>2</kunnr>

我需要从XML文档中选择值。这些值存储为子节点,如下所示:

   <customers>
        <customer>
            <kunnr>1</kunnr>
            <kdgrp>2</kdgrp>
        </customer>
        <customer>
            <kunnr>2</kunnr>
            <kdgrp>2</kdgrp>
        </customer>
    </customers>
到目前为止,我尝试的是:

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>
这导致以下错误消息:

XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

也许是这样的:

kunnr       kdgrp
1           2
2           2
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

我在从T-SQLXML中提取值时遇到了一个问题,发现了一个可能有助于其他人的问题。当使用:.
value(“(/root/subnode)[1]”,'varchar(max)
检索数据时,该调用不会检索数据,但以下调用检索到:
.value(“(/subnode)[1]”,'varchar(max)
。请注意,工作版本将根节点替换为/。第一个调用的问题似乎是根节点带有一个xml名称空间的规范,如
&
并且为了获得返回数据的.value调用,我需要通过名称空间的规范,该规范由于某种原因导致了失败

添加RDBMS(例如SQL Server)可能会使您的问题更具吸引力。
SELECT C.value
中的
C
从何而来?
C
是根XPATH别名
T(C)
的节点,括号帮了我的忙。我没有名称空间,但我正在尝试以下语法:
.value('node/subnode[1]”,'varchar(max)
,并且在获取时需要出现上述单例错误。在路径周围添加括号是我缺少的部分。因此,尽管前面的语法不起作用,但这两种形式都起作用:
.value('mynode[1],'varchar(max)')
.value('(node/subnode)[1],'varchar(max)')
希望这能帮助一些人。
kunnr  kdgrp
1      2
2      2