背景见这个问题:
SQL Server XML Data Type query issue
我正在尝试查询 SQL Server 2005 中的 XML 对象。当 XML 中没有定义命名空间时,查询工作正常。但是,当命名空间元素存在时,我似乎无法获取节点元素的值。这是一个例子:
DECLARE @xmlWithNameSpace XML
DECLARE @xmlWithoutNameSpace XML
SET @xmlWithNameSpace = '<?xml version="1.0" encoding="UTF-8"?>
<Feed xmlns="gizmo">
<Product id="4444">
<ProductId>4444</ProductId>
</Product>
</Feed>'
SET @xmlWithoutNameSpace = '<?xml version="1.0" encoding="UTF-8"?>
<Feed>
<Product id="4444">
<ProductId>4444</ProductId>
</Product>
</Feed>'
SELECT feed.product.value('@id[1]', 'INT') AS productId
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)
UNION ALL
SELECT feed.product.value('ProductId[1]', 'INT') AS productId
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)
UNION ALL
SELECT feed.product.value('@id[1]', 'INT') AS productId
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product)
UNION ALL
SELECT feed.product.value('ProductId[1]', 'INT') AS productId
FROM @xmlWithoutNameSpace.nodes('/Feed/Product') feed(product)
返回
4444
NULL
4444
4444
在使用命名空间时获取 ProductId 节点的值 (4444) 我做错了什么?
提前感谢您的指导。
最佳答案
答案是我还必须定义要使用名称规范访问的节点元素。所有这些示例都按预期返回 4444:
WITH XMLNAMESPACES ('gizmo' AS nsWithXNS)
SELECT feed.product.value('@id[1]', 'INT') AS productId
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product)
UNION ALL
SELECT feed.product.value('nsWithXNS:ProductId[1]', 'INT') AS productId
FROM @xmlWithNameSpace.nodes('/nsWithXNS:Feed/nsWithXNS:Product') feed(product)
UNION ALL
SELECT feed.product.value('@id[1]', 'INT') AS productId
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)
UNION ALL
SELECT feed.product.value('declare namespace ns="gizmo"; ns:ProductId[1]', 'INT') AS productId
FROM @xmlWithNameSpace.nodes('declare namespace ns="gizmo"; /ns:Feed/ns:Product') feed(product)
感谢阅读,我希望这对其他人有帮助。
关于sql-server - 在 SQL Server XML 数据类型查询中使用命名空间时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3461302/