2016-03-31 27 views
2

我想在SQL查詢中展平XML數據,但我似乎總是得到空值。在sql中展平XML數據

我嘗試了描述爲here的十字/外塗法。

帶有XML數據的列被稱爲Data

我猜這些鏈接的XML數據需要以某種方式也添加?

你能幫忙得到一個正確的SQL查詢嗎?

查詢我想:

SELECT 
v.name 
,pref.value('(LocalId/text())[1]', 'nvarchar(10)') as localid 
FROM [database].[requests] v 
outer apply v.Data.nodes('/DataForm') x(pref) 
GO 

該列中的XML數據的例子:

<Dataform xmlns="http://somelongasslink.org/hasalsosomestuffhere" xmlns:i="http://somexlmschemalink/"> 
    <DeleteDate xmlns="http://somelongasslink.org/hasalsosomestuffhere" i:nil="true" /> 
    <LocalId xmlns="http://somelongasslink.org/hasalsosomestuffhere">5325325</LocalId> 
    ... 

回答

2

您可以使用此代碼來獲取您正在尋找的結果是:

;WITH XMLNAMESPACES(DEFAULT 'http://somelongasslink.org/hasalsosomestuffhere') 
SELECT 
    rq.Name, 
    LocalID = TC.value('(LocalId)[1]', 'nvarchar(10)') 
FROM 
    [database].[requests] rq 
CROSS APPLY 
    rq.Data.nodes('/Dataform') AS TX(TC) 
GO 

您的代碼有兩個問題:

  1. 你不尊重/包括對XML文檔

    <Dataform xmlns="http://somelongasslink.org/hasalsosomestuffhere" 
          ******************************************************* 
    
  2. 你沒注意XML的大小寫在調用定義的XML命名空間.nodes() - 你需要使用.nodes('/Dataform')(不/DataForm - 在F在你的XML不大寫)

+1

如果您明確想讀取'i:nil'屬性,您可能還需要定義名稱空間「xmlns:i」... Upvote from our side – Shnugo

+0

如何處理存在多個名稱空間的情況?你提供的代碼工作(謝謝),但沒有名稱空間的其他屬性。 我的例子xml在我的情況下有點不正確,因爲localid中的鏈接命名空間與dataform不同。 – Exanimis

+0

@Exanimis:你將不得不使用'WITH XMLNAMESPACES('.....'AS ns1,'.......'AS ns2)',然後使用XPath表達式中定義的那些前綴 –