【发布时间】:2025-11-30 10:55:01
【问题描述】:
我在 SQL Server 中有一个包含 Xml 列的表,但我无法查询它。我对 XPath 的了解还不够,无法确定我的查询是否错误,或者是因为名称空间似乎有冲突。这是一个示例 xml:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing"
xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<!-- snip -->
</s:Header>
<s:Body>
<FetchRequest xmlns="http://www.foobar.org/my/schema">
<Contract xmlns:a="http://www.foobar.org/2014/04/datacontracts"
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:RequestedBy>John Doe</a:RequestedBy>
<a:TransactionId>ABC20140402000201</a:TransactionId>
</Contract>
</FetchRequest>
</s:Body>
</s:Envelope>
我想从 xml 中检索 TransactionId。我试过的查询是这样的:
SELECT TOP 100
MessageXml,
MessageXml.value('
declare namespace s="http://www.w3.org/2003/05/soap-envelope";
declare namespace a="http://www.w3.org/2005/08/addressing";
(/s:Envelope/s:Body/FetchRequest/Contract/a:TransactionId)[1]', 'varchar(max)')
FROM dbo.Message
我的 MessageXml.value 将返回 NULL。如果我在 s:Body 之后删除所有内容,我似乎会得到一堆串联的文本,但是一旦我添加 FetchRequest,我的结果中就会返回 NULL。
我确实注意到 Contract 元素定义了 a 的命名空间,而 Envelope 也定义了 a 的命名空间,但我不确定这是否有问题。
在给定上述 xml 示例的情况下,如何使用 XPath 查询检索 TransactionId?
【问题讨论】:
标签: sql-server xml xpath