2012-04-29 41 views
3

當您從XML和節點中刪除<data>包裝時,此代碼正常工作,但是當您添加它時,如下所示,我得到0個結果。當XML有2個包裝時,無法讀取內容

-- Declare XML variable 
    DECLARE @data XML; 

    -- Element-centered XML 
    SET @data = 
    N' 
    <data xmlns="test.xsd"> 
    <subdata> 
     <customer> 
     <id>1</id> 
     <name>Allied Industries</name> 
     </customer> 
     <customer> 
     <id>2</id> 
     <name>Trades International</name> 
     </customer> 
    </subdata> 
    </data>'; 

    -- Using the query() method 
    SELECT T.customer.query('id').value('.', 'INT') AS customer_id, 
     T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name 
    FROM @data.nodes('data/subdata/customer') AS T(customer); 

但正常工作時,我不喜歡這樣寫道:

-- Element-centered XML 
    SET @data = 
    N' 
    <subdata> 
     <customer> 
     <id>1</id> 
     <name>Allied Industries</name> 
     </customer> 
     <customer> 
     <id>2</id> 
     <name>Trades International</name> 
     </customer> 
    </subdata> 
'; 

    -- Using the query() method 
    SELECT T.customer.query('id').value('.', 'INT') AS customer_id, 
     T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name 
    FROM @data.nodes('subdata/customer') AS T(customer); 

有誰知道爲什麼我沒有在第一個例子中得到結果,當<data>父包裝是嗎?

回答

6

該問題與XML數據的「包裝」數量無關。問題是:您的第一個示例在<data>節點上定義了XML名稱空間xmlns="test.xsd"),但您的查詢不符合該要求。

你需要改變你的查詢是這樣的:

-- Using the query() method 
;WITH XMLNAMESPACES (DEFAULT 'test.xsd') 
SELECT 
    T.customer.query('id').value('.', 'INT') AS customer_id, 
    T.customer.query('name').value('.', 'VARCHAR(20)') AS customer_name 
FROM 
    @data.nodes('data/subdata/customer') AS T(customer); 

你將得到的結果....

沒有這個XML命名空間聲明,您的查詢會工作得很好 - 兩個包裝或更多無所謂..

+0

雅它做了,謝謝..我也有這個'<?xml version =「1.0」encoding =「utf-8」?>'的另一個問題,當它從上面開始,我得到一個錯誤,說'不能改變xml的編碼類型,如果你很快就知道它,你怎麼得到這個當你的xm l文件在頂部帶有這個文件嗎? –

+2

@ZeeTee:我相信如果你用一個'N'來給你的XML數據加前綴,那麼它不會像utf-8聲明(因爲它現在是一個'NVARCHAR'字符串,因此使用UCS-2 Unicode編碼)。要麼刪除該XML聲明行,要麼刪除「N」前綴。 –

+0

是的,你真棒,那(刪除N')也做了伎倆..謝謝! –