Microsoft SQL Server XML查询:如何获取指定Field节点的目标数据
SQL Server XML查询取值问题修正
原代码失效的核心原因
- 节点路径与实际XML结构不匹配:文档中不存在
ExtendedFields节点,三个目标值均位于Fields节点下的Field子元素内,每个子元素通过自身的name属性区分业务含义,并非独立挂载在父节点上的属性。 - 节点定位规则错误:根节点
MyFeed不属于代码中声明的urn:Thefeed-xsd命名空间,原nodes()函数的通配路径未和实际XML层级对齐,导致连基础的ConventionalValue等固定字段都无法正确关联取值。 - 取值逻辑偏差:原代码尝试读取父节点的
@Identifier、@IdentifierCode、@OwnerID属性,和实际存储结构完全不符——这三个值是对应Field元素的文本内容,不是节点属性。
修正后可正常提取目标值的代码
DECLARE @myDoc XML DECLARE @ProdID varchar(30) SET @myDoc = '<?xml version="1.0" encoding="UTF-8"?> <MyFeed header="header value"> <f:TheFeed xmlns:f="urn:Thefeed-xsd"> <f:ConventionalValue>-100.681356</f:ConventionalValue> <f:ReceiveXPercent>1.0</f:ReceiveXPercent> <f:ReceiveXMonth>3</f:ReceiveXMonth> <f:Fields> <f:Field calcrt="SW1" name="Identifier">ID_US</f:Field> <f:Field calcrt="SW5" name="IdentifierCode">US1</f:Field> <f:Field calcrt="SW10" name="OwnerID">John Smith</f:Field> </f:Fields> </f:TheFeed> </MyFeed>'; WITH XMLNAMESPACES('urn:Thefeed-xsd' AS f) SELECT OgrRol.value('(f:ConventionalValue/text())[1]','nvarchar(50)') AS ConventionalValue, OgrRol.value('(f:ReceiveXPercent/text())[1]','nvarchar(50)') AS ReceiveXPercent, OgrRol.value('(f:ReceiveXMonth/text())[1]','nvarchar(50)') AS ReceiveXMonth, OgrRol.value('(f:Fields/f:Field[@name="Identifier"]/text())[1]','nvarchar(50)') AS Identifier, OgrRol.value('(f:Fields/f:Field[@name="IdentifierCode"]/text())[1]','nvarchar(50)') AS IdentifierCode, OgrRol.value('(f:Fields/f:Field[@name="OwnerID"]/text())[1]','nvarchar(50)') AS OwnerID FROM @myDoc.nodes('/MyFeed/f:TheFeed') A(ogrRol)
关键调整说明
- 命名空间规则优化:将原默认命名空间写法替换为显式绑定命名空间前缀,避免无命名空间的
MyFeed节点被默认命名空间规则误匹配,降低路径歧义。 - 节点定位精准化:将原通配路径改为和实际XML层级完全对齐的
/MyFeed/f:TheFeed,确保取值上下文能正确定位。 - 目标字段取值逻辑重构:匹配实际存储结构,从
f:Fields节点下通过@name属性筛选对应业务的f:Field元素,直接提取节点文本,即可得到预期的ID_US、US1、John Smith三个目标值。
内容的提问来源于stack exchange,提问作者Codez
相关产品推荐
相关产品推荐

