2012-06-29 48 views
0

我已經設法從遊標中創建一個表,從我的數據庫中的類似命名錶插入行。它工作成功,但我想創建一個視圖,以便我不需要更新我的原始查詢。我可以下去使用光標的路線錯誤,但我目前的查詢是:使用光標或循環創建視圖

use LaganPDM 
set nocount on 
declare @table varchar(128) 
declare @cmd varchar(500) 
create table SPECIAL_CASE_FORMS_2 (table_name varchar(128), flods_id numeric(22,0) PRIMARY KEY, lgncc_id numeric(22,0), case_enquiry_id numeric(22,0),amount varchar(4000), costcode varchar(4000), jobcompletedate varchar(4000), jobreleasedate varchar(4000),paymentstatus varchar(4000)) 
declare tables cursor for 
select table_name 
from information_schema.tables 
    where table_name like '%SPECIAL_UP_C00%' 
and left(right(table_name, 24),9) > '101000363' 
and not left(right(table_name, 24),9) in('101000487', '101000507', '101000510') 
open tables 
fetch next from tables into @table 
while @@fetch_status = 0 
begin 
    set @cmd = 'select ''' + @table + ''', * from ' + @table 
insert into SPECIAL_CASE_FORMS_2 exec (@cmd) 
    fetch next from tables into @table 
END 
CLOSE tables 
DEALLOCATE tables 
select * from SPECIAL_CASE_FORMS_2 

我試着去適應這一點,並創建一個視圖,但我有沒有運氣。任何建議都會受到感謝,即使這意味着不同的路線。

謝謝!

+5

爲什麼這需要一個視圖? –

+3

視圖是一個預定義的查詢,不能像循環,光標那樣使用編程邏輯。 –

+0

Thx夥計。我不確定它是否有必要,我只是希望產生一個可以加入我現有的報告的查詢,所以我不需要隨時更新它 - 每當一個新表(使用這個相似的名稱)被添加到數據庫中,我的查詢會自動選擇並將其添加到表中。 – user1354015

回答

0

正如評論中所說的,您不能在視圖中使用遊標,只能在存儲過程中使用遊標。

爲了得到查詢到表中,每當一個新的表被添加到數據庫時自動更新的結果,你可以做到以下幾點:

首先,你已經中創建一個名爲SPECIAL_CASE_FORMS_2永久表數據庫。
您可以將此表用於您的現有報告,因此您需要確保它經常更新。
你甚至都不需要創建表中的每個執行查詢的時間...只是在數據庫中創建一次手動和您的查詢的開頭與此更換create table行:

delete from SPECIAL_CASE_FORMS_2 

另外,你可以在最後刪除這一行:

select * from SPECIAL_CASE_FORMS_2 

現在create a SQL Server Agent job其執行查詢。
您可以將完整查詢粘貼到the "Command" field中,也可以將查詢保存爲存儲過程,然後在作業中執行存儲過程。
(我更喜歡後者,因爲這樣一來,實際的代碼是在同一個數據庫表 - 在SQL Server代理作業保存在msdb系統數據庫)

排定作業,使其運行每天一次。

就是這樣!

現在這份工作將每天刪除並重新填寫SPECIAL_CASE_FORMS_2表格,您可以在所有報告中使用該表格。
如果將新表添加到數據庫中,則其數據也將在第二天在SPECIAL_CASE_FORMS_2表中。
(如果你需要它早於第二天,正好安排SQL Server代理作業,使之運行,每天數次)

另外,您的報告將運行得更快這種方式,因爲他們剛剛得到的數據來自預填表。
上面的查詢通過多個表循環並將數據插入到新表中,因此對於每個報表再次執行該操作會更慢並且會導致數據庫負載更大。

0

我覺得CTE比光標更適合,所以也許嘗試這個

use LaganPDM 

Create view as [dbo].[test] 
With cteTables as (
select 
* 
from 
information_schema.tables 
where table_name like '%SPECIAL_UP_C00%' and left(right(table_name, 24),9) > '101000363' and not left(right(table_name, 24),9) in('101000487', '101000507', '101000510')) 
Select 
* -- because it's a view, you'll have to list all the columns instead of just using select * 
From 
CteTables 

警告有關CTE不過的詞,它可以有性能問題,如果你正在經歷的記錄堆,所以還是在心神。