2013-03-18 75 views
0

選擇我有一個表在SQL Server 2008具有以下結構:從XML與未知結構

id  = int 
numero = int 
datos = xml 
[other_misc_fields] 

你可以看到桌子上這sql fiddle一些示例數據。正如您在鏈接上看到的,數據庫(data)是一個XML。這個XML沒有已知的結構。我所知道的是,root是「lote」,並且每個字段都有一個屬性「title」,它是該字段的「顯示名稱」。我希望能沿着這條線

id | numero | display_name_field_1 | display_name_field_2 | display_name_field_3 
1 | 23 |  value_field_1 |  value_field_2 |  value_field_3 

使用一些dynamic sql(從another so answer)我能得到每個節點的值查詢的東西,但我無法弄清楚如何使用其重命名標題屬性:

select @SQL = 'select '+stuff(
    (
    select ',T.N.value('''+T.N.value('local-name(.)', 'sysname')+'[1]'', ''varchar(max)'') as '+T.N.value('local-name(.)', 'sysname') 
    from @XML.nodes('/*[local-name(.)=sql:variable("@KnownName")]/*') as T(N) 
    for xml path(''), type 
).value('.', 'nvarchar(max)'), 1, 1, '')+ 
    ' from @XML.nodes(''/*[local-name(.)=sql:variable("@KnownName")]'') as T(N) 

其中@KnownName是「lote」。

如何修改該查詢,使字段重命名爲該節點的@title屬性?或者,或者,有沒有更好的方法來做到這一點比動態SQL?

回答

0

原來這樣做相對容易。唯一的問題是列名不能輕易設置爲動態值。最後,我決定來處理XML客戶端,但是這是一個方式做類似我想要的東西,如果有人有興趣:

SELECT @SQL = 'select '+stuff(
     (
     SELECT ',T.N.value('''+T.N.value('local-name(.)', 'sysname')+'[1]'',''varchar(max)'') as '+ T.N.value('local-name(.)', 'sysname')+', T.N.value(''('+T.N.value('local-name(.)', 'sysname')+'/@title)[1]'+''',''varchar(max)'') as '+ T.N.value('local-name(.)', 'sysname')+'@title' 
     FROM @XML.nodes('/*[local-name(.)=sql:variable("@KnownName")]/*') AS T(N) 
     FOR xml path(''), TYPE 
    ).value('.', 'nvarchar(max)'), 1, 1, '')+ 
     ' from @XML.nodes(''/*[local-name(.)=sql:variable("@KnownName")]'') as T(N)' 

你可以看到「在行動」它在這sqlfiddle :http://www.sqlfiddle.com/#!3/5408e/13/0