麻烦

2010-08-11 150 views
4

有关背景看这个问题:麻烦

SQL Server XML Data Type query issue

我想查询对SQL Server的XML对象2005年查询工作正常没有时在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 

我在做什么错,以获得产品编号节点(4444)时,命名空间是在使用中的价值?

在此先感谢您的任何指导。

回答

4

答案是我必须定义我试图使用namespece访问的节点元素。所有这些样品预期返回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) 

感谢您的阅读,我希望这可以帮助别人。

+0

顶部问题很好,但底部(WITH关键字)在SQL-Server-2012中引发语法错误 - 任何想法RP? – Hardryv 2016-02-17 23:26:06

+0

尝试在WITH之前添加一个分号。我希望有所帮助。 – 2016-03-10 21:00:30