使用SQL导入XML中GivenName字段失败,疑XMLNameSpaces配置有误
问题修复说明
你遇到的问题主要由两处错误导致:
- 命名空间声明错误:你的原代码仅声明了一个默认命名空间,但XML存在两层不同的默认命名空间:根节点
<Envelope>及<Body>属于http://www.w3.org/2003/05/soap-envelope,<OTA_Example>及其下级节点属于http://www.opentravel.org/OTA/2003/05,无法共用同一个默认命名空间,需要分别声明前缀区分。 - 取值逻辑错误:你在
value方法中用@GivenName是取节点属性,但示例XML中GivenName是<PersonName>的子元素,不是属性;同时路径层级匹配错误,T2返回的是<ResUser2>节点,下级直接对应<Profiles>,不需要在路径开头重复写Profiles[1]。
修正后可正常运行的SQL代码
DECLARE @xml XML = (SELECT [Xml] FROM ExampleTable) ;WITH XMLNAMESPACES ( 'http://www.w3.org/2003/05/soap-envelope' AS soap, DEFAULT 'http://www.opentravel.org/OTA/2003/05' ) SELECT FirstName = ProfileInfo.value('(Profiles/ProfileInfo/Profile/Customer/PersonName/GivenName)[1]', 'nvarchar(255)') FROM @xml.nodes('soap:Envelope/soap:Body/OTA_Example/Info/Infos/ResUser') as T1(ResUserNode) OUTER APPLY T1.ResUserNode.nodes('ResUser2') as T2(ProfileInfo)
运行后可正确获取到GivenName的值FirstnameTest。
内容的提问来源于stack exchange,提问作者BrianF.
相关产品推荐
相关产品推荐

