2011-07-21 31 views
3

我已經被存儲在SQL Server 2005中的一些(非類型化),XML,我需要轉變成一個標準化的結構。該文件的結構目前看起來像這樣:使用SQL Server 2005的XML API標準化的XML片段

<wrapper> 
<parent /> 
<node /> 
<node /> 
<node /> 

<parent /> 
<node /> 
<node /> 
<node /> 
<wrapper> 

我想去改造它看起來像這樣:

<wrapper> 
<parent> 
    <node /> 
    <node /> 
    <node /> 
</parent> 
<parent> 
    <node /> 
    <node /> 
    <node /> 
</parent> 
<wrapper> 

我可以出選擇XML轉換關係結構,如果我需要,把問題沒有連接父屬性和子節點一起,讓全光照時,爲了成爲一個問題g基於集合的操作。如何使用.nodes()/ .val()/其他SQL Server XML API來轉換此數據?轉換需要作爲批處理SQL腳本的一部分運行,因此將其提取到另一種工具/語言對我來說不是一個合理的選擇。

+1

我很懷疑,你可以做這樣的事情在SQL Server上合理的努力。它的XQuery引擎非常適合查詢XML並從中提取數據 - 更不用說在操作方面做更重的提升。我認爲你最好把SQL從SQL Server中抓到例如C#/。NET並在那裏修復並將其存回。 –

回答

1

其實 - 下面的代碼工作(這裏的分組可能不是很最優的,但無論如何):

declare @xml xml = ' 
    <wrapper> 
    <parent id="1" /> 
    <node id="1" /> 
    <node id="2" /> 
    <node id="3" /> 

    <parent id="2" /> 
    <node id="4" /> 
    <node id="5" /> 
    <node id="6" /> 
    </wrapper> 
' 

;with px as 
(
    select row_number() over (order by (select 1)) as RowNumber 
     ,t.v.value('@id', 'int') as Id 
     ,t.v.value('local-name(.)', 'nvarchar(max)') as TagName 
    from @xml.nodes('//wrapper/*') as t(v) 
) 
select p.Id as [@id], 
    (
     select n.Id as id 
     from px n 
     where n.TagName = 'node' 
      and n.RowNumber > p.RowNumber 
      and not exists 
      (
       select null 
       from px np 
       where np.TagName = 'parent' 
        and np.RowNumber > p.RowNumber 
        and np.RowNumber < n.RowNumber 
      ) 
     order by n.RowNumber 
     for xml raw('node'), type 
    ) 
from px p 
where p.TagName = 'parent' 
order by p.RowNumber 
for xml path('parent'), root('wrapper')

但我不建議使用它。在這裏看到:http://msdn.microsoft.com/en-us/library/ms172038%28v=sql.90%29.aspx

在SQLXML 4.0,文檔順序並不總是確定
所以我不知道我們是否能夠依靠內包裝標籤順序(和上面的代碼只是爲了好玩比實際使用更多)。

+0

感謝您的意見,我得出了同樣的結論 - 這是非確定性的。我會弄清楚別的。 –

+0

@jonathan - 您可以使用'位置()'用數字表枚舉保證確定的方式行。看看這個答案。 http://stackoverflow.com/questions/6472533/xquery-and-node-ids/6473228#6473228 –

+1

偉大的解決方案!我試圖在值函數中使用position(),但它沒有幫助(位置只能在謂詞中使用)。 – oryol