2009-09-12 102 views
1

請請參閱SQL Server 2005以下腳本SQL Server中的XML數據類型的查詢問題

Declare @xmlData XML 
SET @xmlData = '<?xml version="1.0"?> 
<bookstore xmlns="http://myBooks"> 
    <book genre="autobiography" publicationdate="1981" 
     ISBN="1-861003-11-0"> 
    <title>The Autobiography of Benjamin Franklin</title> 
    <author> 
     <first-name>Benjamin</first-name> 
     <last-name>Franklin</last-name> 
    </author> 
    <price>8.99</price> 
    </book> 
    <book genre="novel" publicationdate="1967" 
     ISBN="0-201-63361-2"> 
    <title>The Confidence Man</title> 
    <author> 
     <first-name>Herman</first-name> 
     <last-name>Melville</last-name> 
    </author> 
    <price>11.99</price> 
    </book> 
    <book genre="philosophy" publicationdate="1991" 
     ISBN="1-861001-57-6"> 
    <title>The Gorgias</title> 
    <author> 
     <first-name>Sidas</first-name> 
     <last-name>Plato</last-name> 
    </author> 
    <price>9.99</price> 
    </book> 
</bookstore>' 

Select T.Item.query('.') 
From @xmlData.nodes('/bookstore/book') AS T(Item) 

這個腳本應該給我所有的書節點的名單。但它沒有給予預期的行爲。如果我刪除XMLNS,那麼它工作正常。誰能解釋一下?

下面工作正常。

Declare @xmlData XML 
SET @xmlData = '<?xml version="1.0"?> 
<bookstore> 
    <book genre="autobiography" publicationdate="1981" 
     ISBN="1-861003-11-0"> 
    <title>The Autobiography of Benjamin Franklin</title> 
    <author> 
     <first-name>Benjamin</first-name> 
     <last-name>Franklin</last-name> 
    </author> 
    <price>8.99</price> 
    </book> 
    <book genre="novel" publicationdate="1967" 
     ISBN="0-201-63361-2"> 
    <title>The Confidence Man</title> 
    <author> 
     <first-name>Herman</first-name> 
     <last-name>Melville</last-name> 
    </author> 
    <price>11.99</price> 
    </book> 
    <book genre="philosophy" publicationdate="1991" 
     ISBN="1-861001-57-6"> 
    <title>The Gorgias</title> 
    <author> 
     <first-name>Sidas</first-name> 
     <last-name>Plato</last-name> 
    </author> 
    <price>9.99</price> 
    </book> 
</bookstore>' 

Select T.Item.query('.') 
From @xmlData.nodes('/bookstore/book') AS T(Item) 

任何人都可以請解釋我該如何糾正第一次scritp?我想用xmlns運行腳本。

回答

2

正如你所說的 - 這是因爲你原來的XML數據是一個XML命名空間,如果是那樣的話,你還需要利用該XML命名空間在您的XQuery:

SELECT 
    T.Item.query('.') 
FROM 
    @xmlData.nodes('declare namespace ns="http://myBooks";/ns:bookstore/ns:book') 
    AS T(Item) 

您需要將declare namespace ns="http://myBooks";部分插入到您的XQuery中,然後使用已定義的名稱空間前綴ns(您可以在此處使用任何內容)來引用XML對象。

Marc