0

我在 SQL Server 2008 中有一个表,其结构如下:

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

您可以在此sql fiddle上查看包含一些示例数据的表。正如您在链接上看到的,字段datos (data) 是一个 XML。此 XML 没有已知的结构。我所知道的是根是“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

使用一些动态 sql(来自另一个所以回答)我能够从每个节点获取值,但我无法弄清楚如何使用 title 属性重命名它:

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 更好的方法呢?

4

1 回答 1

1

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

于 2013-03-22T13:13:40.910 回答