从XML与未知结构

问题描述:

选择我有一个表在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?

原来这样做相对容易。唯一的问题是列名不能轻易设置为动态值。最后,我决定来处理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