我有两个与 Id 列相关的表(使用表变量进行说明。您可以直接在管理工作室中运行这些表)。
第一个表中的项目有一些标准的列集,第二个表有相同记录的一些扩展参数数据。我将扩展集存储为 xml,因为它在所有方面都是动态的(每个产品不同或添加的新值等)。
正如您在下面的示例中所见,我能够连接这两个表并展平列列表。但是我的查询需要预先定义动态列。从某种意义上说,如果我要在@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