gpt4 book ai didi

sql-server - 具有多个命名空间的 SQL Server Xml 查询

转载 作者:数据小太阳 更新时间:2023-10-29 01:43:48 26 4
gpt4 key购买 nike

我在 SQL Server 中有一个表,其中包含一个 Xml 列,但我无法查询它。我对 XPath 的了解还不够,无法确定我的查询是否错误,或者是否是因为 namespace 冲突。这是一个示例 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?

最佳答案

我知道答案已被接受,但实际上有更简单的方法,如果您唯一需要做的就是选择节点值。只需使用 * 作为命名空间名称:

SELECT MessageXml
, MessageXml.value('(/*:Envelope/*:Body/*:FetchRequest/*:Contract/*:TransactionId)[1]'
, 'varchar(max)')
FROM dbo.Message

关于sql-server - 具有多个命名空间的 SQL Server Xml 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22818591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com