0

私は次のようなxmlを持っています:

<root>
    <item>
        <Name>Pants</Name>
        <Value>No</Value>
    </item>
    <item>
        <Name>Other</Name>
        <Value>Yes</Value>
    </item>
</root>

<root>
    <item>
        <Name>Pants</Name>
        <Value>Yes</Value>
    </item>
    <item>
        <Name>Other</Name>
        <Value>Yes</Value>
    </item>
</root>

<root>
    <item>
        <Name>a</Name>
        <Value>b</Value>
    </item>
    <item>
        <Name>c</Name>
        <Value>d</Value>
    </item>
</root>

root要素はSQLサーバーデータベースの列に格納されており、それに基づいて列/行を作成する必要があります. 「名前」を列名として使用し、その列に値を入力したいと思います。また、常に 2 つ<item>の要素があるとは限らず、多かれ少なかれ存在する可能性があります。

したがって、上記のすべてが照会されると、次のことが必要になります。

|other columns|Pants|Other|a|c|<-column names
|~~~~~~~~~~~~~|No   |Yes  | | |<-rows
|~~~~~~~~~~~~~|Yes  |Yes  | | |
|~~~~~~~~~~~~~|     |     |b|d|

これは可能ですか?

4

2 に答える 2

1
SELECT 
   XMLColumnName.value('(/root/item/Name)[1]','varchar(max)') AS firstname,
   XMLColumnName.value('(/root/item/Value)[1]','varchar(max)') AS myValue

FROM MyTable

''タグをそのまま使用している理由がわかりません<root>(通常、XML値全体に対して1つの物乞いと終了タグがあります)。違いはないかもしれませんが、あなたは見なければなりません。

于 2013-02-25T18:19:35.327 に答える
1

列数が動的な場合は、動的 SQL が必要です。

関心のある名前/値リストを一時テーブルに入力することから始めます。次に、一時テーブルから動的 SQL ステートメントを作成し、動的クエリを実行します。

select ID,
       X.N.value('(Name/text())[1]', 'varchar(max)') as Name,
       X.N.value('(Value/text())[1]', 'varchar(max)') as Value
into #T
from T
  cross apply T.XMLCol.nodes('root/item') as X(N)

declare @SQL nvarchar(max)
declare @Col nvarchar(max)

select @Col = 
  (
  select distinct ','+quotename(Name)
  from #T
  for xml path(''), type
  ).value('substring(text()[1], 2)', 'nvarchar(max)')

set @SQL = 'select ID,'+@Col+'
            from #T
            pivot (max(Value) for Name in ('+@Col+')) as P'

exec (@SQL)

drop table #T

SQL フィドル

于 2013-02-26T14:22:52.717 に答える