Sql server 在SQLServer2008R2中使用XMLNS解析XML

Sql server 在SQLServer2008R2中使用XMLNS解析XML,sql-server,xml,tsql,Sql Server,Xml,Tsql,我对查询XML数据类型相当陌生。我们从合作伙伴处收到XML,其中一个合作伙伴向我们发送如下XML: DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing"> <customer> <ID>158</ID> </customer> </outGoing>

我对查询XML数据类型相当陌生。我们从合作伙伴处收到XML,其中一个合作伙伴向我们发送如下XML:

DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
    <customer>
        <ID>158</ID>
    </customer>
</outGoing>'
返回NUll,但是如果我手动从XML中删除XMLN,则得到158

我已经用XMLNAMESPACES试验了
,看看是否可以使用它,但我显然遗漏了一些东西。由于这些XML将自动进入,我希望能够解析XML,但现在我被卡住了

这应该行得通:

DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
    <customer>
        <ID>158</ID>
    </customer>
</outGoing>'

;WITH XMLNAMESPACES(DEFAULT 'urn:testsystems-com:HH.2015.Services.Telephony.OutGoing')
SELECT
     @ResultData.value('(/outGoing/customer/ID)[1]', 'int')
这将返回
158
作为其值


我在XMLNAMESPACES中使用了
(默认值…)
,因为这是唯一的XML名称空间,它是在顶级节点上定义的,所以它适用于XML结构中的每个节点。

谢谢@Marc!这件事救了我的命,也救了我的理智。因此,即使它是在xml的顶级节点中声明的,它也不会自动应用于结构中的每个其他节点,并且您必须显式声明它?@user3333088:当在节点上定义xml命名空间时,它会“继承”到所有子节点,除非子节点显式定义其他内容。因此,这里所有的XML节点实际上都是定义的XML名称空间的一部分-因为它是在没有显式前缀(
xmlns=“…”
)的情况下定义的,所以它会自动应用于所有子节点。
DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
    <customer>
        <ID>158</ID>
    </customer>
</outGoing>'

;WITH XMLNAMESPACES(DEFAULT 'urn:testsystems-com:HH.2015.Services.Telephony.OutGoing')
SELECT
     @ResultData.value('(/outGoing/customer/ID)[1]', 'int')
;WITH XMLNAMESPACES(DEFAULT 'urn:testsystems-com:HH.2015.Services.Telephony.OutGoing')
SELECT 
    CustomerID = cust.value('(ID)[1]', 'INT') 
FROM    
    @ResultData.nodes('/outGoing/customer') as t(cust)