思路是这样的:
现在有A表,B表,C表:
A:
a01 a02
--------
1 11
2 22
B:
b01 b02
--------
10 101
20 201C表:
c01 c02
--------
A xx
B xx现要想取得表A和表B(表A和表B的表名来自表C查询出来的第一个c01字段)中的前两个字段的数据即a01,a02;b01,b02字段并融合成一张表tmp里,如下显示:
tmp
t01 t02
--------
a01 a02
b01 b02
现在有A表,B表,C表:
A:
a01 a02
--------
1 11
2 22
B:
b01 b02
--------
10 101
20 201C表:
c01 c02
--------
A xx
B xx现要想取得表A和表B(表A和表B的表名来自表C查询出来的第一个c01字段)中的前两个字段的数据即a01,a02;b01,b02字段并融合成一张表tmp里,如下显示:
tmp
t01 t02
--------
a01 a02
b01 b02
tmp
t01 t02
--------
1 11
2 22
10 101
20 201
select top(1) @firstTable=c01 from (select top(2) c01 from C order by c01 asc) as c1;
declare @secondTable nvarchar(10);
select top(1) @secondTable=c01 from (select top(2) * from C order by c01 desc)as c2;exec('select top(2) a01 as t01,a02 as t02 from '+ @firstTable+' union '+' select top(2) * from '+@secondTable);
if object_id('A') is not null
drop table A;
goif object_id('B') is not null
drop table B;
goif object_id('C') is not null
drop table C;if object_id('temp') is not null
drop table temp;
go--创建测试表
create table A
(
a01 int,
a02 int
);
gocreate table B
(
b01 int,
b02 int
);
gocreate table C
(
c01 nvarchar(10),
c02 nvarchar(10)
);
go--插入测试数据
insert into A
select 1, 11 union all
select 2, 22;
goinsert into B
select 10, 101 union all
select 20, 201;
goinsert into C
select 'A', 'xx' union all
select 'B', 'xx';
go--生成动态查询语句
declare @sql nvarchar(max);
set @sql = '';declare @table_name nvarchar(10);
declare @i int;
set @i = 0;declare cur_c cursor for
select c01 from C;open cur_c;
fetch next from cur_c into @table_name;while @@fetch_status = 0
begin
if @i = 0
set @sql = @sql + 'select * into temp from ' + @table_name;
else
set @sql = @sql + ' union all select * from ' + @table_name;
set @i = @i + 1;
fetch next from cur_c into @table_name;
end;close cur_c;
deallocate cur_c;--执行动态查询语句
exec (@sql);
go--检查结果
select *
from temp;
go
/*
a01 a02
----------- -----------
1 11
2 22
10 101
20 201
*/