麻煩

2010-08-11 151 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