Id列によって関連付けられた2つのテーブルがあります(説明のためにテーブル変数を使用しています。これらはManagement Studioで直接実行できます)。
最初のテーブルのアイテムにはいくつかの標準の列セットがあり、2番目のテーブルには同じレコードの拡張パラメーターデータがあります。拡張セットはすべての面で動的であるため、xmlとして保存しています(製品ごとに異なる、または新しい値が追加されるなど)。
次の例に示すように、これら2つのテーブルを結合して、列リストをフラット化することができます。しかし、私のクエリでは、動的列を事前に定義する必要があります。@extendedテーブルに新しい列を追加すると、出力列リストに新しい列として自動的に表示されるという意味で、これを本当に動的にしたいと思います。
基本的に、追加の列のリストは、そのレコードのxmlによって決定される必要があります。列名はxmlタグであり、値は各IDのxmlタグの値である必要があります。
ポインタはありますか?(そして、各テーブルに約10万レコード以上ある場合も高速になります)
declare @standard table
(
Id INT,
Column1 varchar(10),
Column2 varchar(10),
Column3 varchar(10)
)
declare @extended table
(
Id INT,
column1 xml
)
insert into @standard values (1,'11', '12', '13')
insert into @standard values (2,'21', '22', '23')
insert into @extended values (1,'<FieldSet><Field><id>1</id><column4>1x</column4><column5>4x</column5></Field></FieldSet>')
insert into @extended values (2,'<FieldSet><Field><id>2</id><column4>2x</column4><column5>5x</column5></Field></FieldSet>')
select s.column1, s.column2,
(
SELECT Item2.value('(column4)[1]', 'varchar(50)')
FROM
e.column1.nodes('/FieldSet') AS T(Item)
CROSS APPLY e.column1.nodes('/FieldSet/Field') AS T2(Item2)
) column4,
(
SELECT Item2.value('(column5)[1]', 'varchar(50)')
FROM
e.column1.nodes('/FieldSet') AS T(Item)
CROSS APPLY e.column1.nodes('/FieldSet/Field') AS T2(Item2)
) column5
from @extended e
join @standard s on s.Id = e.Id