2017-04-24 67 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查詢。然後您可以執行最後一個,但您需要提供表格的名稱。您也可以參數化表名。 –