2017-04-24 37 views
0

我已经搜索了这个答案,但不知道我是否一直在寻找正确的条款?从指定表名选择数据?

我希望有人能帮忙吗?

我有一个查询,看起来像这样

select name 
from CDSArchive.sys.tables 
where name like '%OPARDENTIA%' 
    and create_date >= '01 apr 2016' 
ORDER BY create_date DESC 

这给了我数据库中的所有表的列表。这些表格包含完全相同的列/数据,但是每个月都会生成一个新表格,该表格会导入最新的数据。

是否有可能编写一些能够在运行时自动将所有这些表联合起来的东西?例如,我想在本月底运行它,它会产生一个输出结果,包括今天上午生成的最新表格的所有联合表格。

我希望有人能帮忙吗?

非常感谢:)

+0

您可以通过设置一个作业或DDL触发器来重新定义组合表格的视图。但是,更改实际创建表的作业更有意义,以便将数据放入具有运行月份列的单个表中。 –

+0

我同意修改工作,但他们来自不同的部门,所以我们无法控制我们收到他们的方式。我的代码是什么样子会重新定义视图?如果我手动输入表名,我将能够创建一个包含所有联合表的视图,但我希望它自动联合它们。所以当添加一个新表时,它会自动包含在工会中,而不需要我指定它? – jd8766

回答

0

你可以生成动态SQL使用游标(该不会是非常糟糕的表现明智的,因为它只能通过尽可能多的表迭代,你有 - 每月一个,12每年 - 不那么痛苦),然后执行该动态查询。

declare @tableName varchar(100), @sql nvarchar(max) = '', @sqlInsert nvarchar(max) = '' 

declare sqlcursor cursor for 
select name 
from sys.tables 
where name like '%OPARDENTIA%' and create_date >= '01 apr 2016' 
order by create_date desc 
open sqlcursor 
fetch next from sqlcursor into @tableName 
while @@fetch_status = 0 
begin 

    if @sql != '' set @sql += ' union all ' 
    set @sql += ' select * from ' + @tableName 

fetch next from sqlcursor into @tableName 
end 
select @sql 
close sqlcursor 
deallocate sqlcursor 

set @sqlInsert = 'insert into YourNewTable select * from (' + @sql + ') as t' 
select @sqlInsert 

注:代替SELECT *我会去串接@sql字符串UNION时明确选择列的名称。

+0

非常感谢你为这个rigerta。快速的问题 - 如果我想把这个输出放到另一个表中,我会把我的代码放在哪里?我试图在动态SQL插入查询,但它似乎并没有工作? – jd8766

+0

我编辑了答案,添加了一个名为@sqlInsert的新变量,当光标完成时它将被动态地创建,它将存储INSERT INTO查询。然后您可以执行最后一个,但您需要提供表格的名称。您也可以参数化表名。 –