从SQL中的XML中选择值
我需要从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>
<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