表1
a b c
1 2 3
11 22 33表2
a b c
4 5 6
44 55 66表3
a b c
7 8 9
77 88 99表4
a a1 a2 b b1 b2 c c1 c2
1 4 7 2 5 8 3 6 9
11 44 77 22 55 88 33 66 99要求:表1表2 表3合并成表4,且表1表2表3都是动态生成,即列数量不固定。
a b c
1 2 3
11 22 33表2
a b c
4 5 6
44 55 66表3
a b c
7 8 9
77 88 99表4
a a1 a2 b b1 b2 c c1 c2
1 4 7 2 5 8 3 6 9
11 44 77 22 55 88 33 66 99要求:表1表2 表3合并成表4,且表1表2表3都是动态生成,即列数量不固定。
最初的想法是:
select 表1.a a,表2.a a2,表3.a a3,表1.b,表2.b b2,表3.b b3 b1... from 表1,表2,表3
但不能每次都手写,而且列数一多这就纯粹体力活了。
declare @sql_tb varchar(2000),
@sql_col varchar(2000),
@sql varchar(8000)
set @sql_tb = '表1, 表2, 表3' --注意要加空格
set @sql_col = 'a, b, c' --注意要加空格
set @sql_col = '''' + replace(@sql_col, ', ', ''', ''') + ''''
set @sql = 'declare @sql varchar(4000) set @sql = ''select '' select @sql = @sql + a.name + ''.'' + b.name + '' ['' + a.name + ''.''+ b.name + ''],'' from sysobjects a left join syscolumns b on a.id = b.id where a.name in ('
+ '''' + replace(@sql_tb, ', ', ''', ''') + '''' + ') and b.name in (' + @sql_col + ') order by b.name, a.name set @sql = rtrim(@sql) set @sql = left(@sql, len(@sql) - 1) + '' from ' + @sql_tb + ''' print(@sql) exec(@sql)'
exec(@sql)