SQL Server动态SQL从多个具有相似名称的表中选择相同的列

时间:2012-04-26 10:55:58

标签: sql-server sql-server-2005

我有多个表(经常不经常更新),这会在我的数据库中创建新表。然后,我必须使用案例函数更新我的报告以查询这些历史表。鉴于我必须提供的报告数量,这是一个冗长的练习,这可能意味着我的报告由于冗长的案例陈述和表现而表现不佳。全外连接。我希望使用某种通配符来查看这些类似命名的表来提取数据(我需要的列都具有相同的名称),这样每次更新数据库时,我都不需要重写我的所有查询。例如

Table1.PaymentStatus
Table1.Amount
Table2.PaymentStatus
Table2.Amount
....
TableX.PaymentStatus
TableX.Amount

我需要的字段是什么 - >

Payment Status   Amount
All Data         All Data   

希望我可以创建某种动态的SQL,包括Union All,然后将这种子查询链接到我的其余表。我对动态SQL没有多少经验,&在论坛上发现了这个问题&我试图适应它(并同时学习!)但我没有太多运气。

declare @columns table (idx int identity(1,1), table_name varchar(100), column_name varchar(50)) 

insert into @columns (table_name, column_name)  
select table_name, column_name 

from INFORMATION_SCHEMA.COLUMNS 

where table_name like '%Special%' 

declare @sql nvarchar(4000) 

declare @i int 
declare @cnt int 

declare @col varchar(100) 
declare @table varchar(100) 

select @i = 0, @cnt = max(idx), @sql = '' from @columns 

select *
from @columns

while @i < @cnt 
begin 
    select @i = @i + 1 

    select @col = column_name, @table = table_name from @columns where idx = @i 

    if len(@sql) > 0 
        select @sql = @sql + ', ' 

    select @sql = @sql + '[' + @table + '].[' + @col + '] as [' + @table + '_' + @col + ']' 
end 

select @sql = 'select ' + @sql + ' from *' 

exec sp_executesql @sql

我有另外一个关于创建视图并将我的查询链接到此视图的建议,因此每次更新时我只需要更新此视图,但是想知道是否有更自动的解决方案。不幸的是,我无法控制这些副本的创建方式。

谢谢!

1 个答案:

答案 0 :(得分:0)

创建一个包含表的视图,然后编写一个查询,使用最新的表删除并重新创建视图。

然后,只要表格发生变化,您就可以运行一次该查询。

您可以通过查询sys.tables来获取表的列表。