0

SQL Server 2008には、次の構造のテーブルがあります。

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

このSQLフィドルのいくつかのサンプルデータを含む表を見ることができます。リンクからわかるように、フィールドdatos(データ)は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を使用して(別の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 に答える