我是查询XML数据类型的新手。我们从合作伙伴那里收到XML,一个这样的合作伙伴向我们发送这样的XML:
DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
<customer>
<ID>158</ID>
</customer>
</outGoing>'
在这个例子中,我想只从XML中提取ID,但似乎xmlns阻止我在XML中获取任何内容:
SELECT cust.value('(ID)[1]', 'VARCHAR(40)') as 'CustomerID'
FROM @ResultData.nodes('/outGoing/customer') as t(cust)
返回NUll,但如果我手动从XML中删除XMLNS,我会得到158。
我已经尝试WITH XMLNAMESPACES
看看我是否可以使用它,但我显然错过了一些东西。由于这些XML将自动进入,我希望能够解析XML,但是现在我被卡住了。
答案 0 :(得分:1)
这应该有效:
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)
这将返回158
作为其值。
我使用过WITH XMLNAMESPACES(DEFAULT .....)
,因为这是唯一的XML命名空间,它在顶层节点定义 - 因此它适用于XML结构中的每个节点。