2012-01-06 46 views
0

我不確定是否可以使用TSQL中的循環執行此操作。循環訪問數據庫列表以刪除並重新創建視圖

我有一個數據庫列表,我想循環訪問每個數據庫並根據需要重新創建視圖。

我有一個腳本已經放棄並重新創建視圖。然而,目前在我的腳本的頂部,我有一堆使用語句,我只是在列表中取消註釋並重新運行腳本。不過,我想自動化它,所以它會更快。我在過去做了一個類似的事情,即通過一串數據庫名稱來循環,並使用它來執行使用語句。除了創建視圖之外,哪些工作是有效的,因爲視圖必須由go語句分隔。這裏是我的代碼解析數據庫的任何幫助,使視圖工作的代碼片段將是偉大的。

DECLARE @DBs AS VARCHAR(MAX); 
DECLARE @OneDB AS VARCHAR(255); 
DECLARE @CmdToExec AS VARCHAR(MAX); 

SET @DBs = 'db1,db2,db3,db4,db5,db6,db7,db8,db9,db10,db11,db12,db13,db14,db15,db16' 

DECLARE DB_Cursor CURSOR FOR 
    SELECT SUBSTRING(',' + @DBs + ',', n + 1, 
     CHARINDEX(',', ',' + @DBs + ',', n + 1) - n - 1) AS "dbInfo" 
    FROM CommunityPAL.dbo.Numbers 
    WHERE SUBSTRING(',' + @DBs + ',', n, 1) = ',' 
     AND n < LEN(',' + @DBs + ','); 
OPEN DB_Cursor; 
FETCH NEXT FROM DB_Cursor INTO @OneDB; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @CmdToExec = 'USE ' + @OneDB; 
    EXEC @CmdToExec; 

    --statements to execute 

    FETCH NEXT FROM DB_Cursor INTO @OneDB; 
END 
CLOSE DB_Cursor 
DEALLOCATE DB_Cursor 
+0

」有一個我想循環訪問的數據庫列表,併爲每個數據庫刪除並根據需要重新創建視圖。「 - 爲什麼? – 2012-01-06 15:44:23

+0

需要將新字段添加到每個視圖中我有一個使用來自不同客戶端數據庫的視圖的Web應用程序 – user1134537 2012-01-06 18:30:45

回答

0

我很確定你不能在T-SQL中獨自做你想做的事情。 CREATE VIEW(和ALTER VIEW)不要使用三部分命名約定(database.schema.object)。它必須是批處理中唯一的語句,因此它不能與動態SQL調用(EXECsp_executeSQL)中的USE命令結合使用,並且該USE的影響只會持續到該批處理的持續時間(即直到任何嵌入GO)。但是,我從「外部」SQL服務器完成了類似的工作,更新了某個「類型」(每個客戶/客戶有一個)的所有數據庫中的特定對象。它變得複雜。簡要概述:

  • 使用您選擇
  • 循環的腳本(或編程)語言上的數據庫
  • 執行SQLCMD一次爲每一個數據庫列表,並執行你的[RE]CREATE VIEW腳本
+0

還保留子範圍。 'EXEC('USE tempdb; EXEC(''CREATE VIEW foo AS SELECT 1 AS X'')')' – 2012-01-06 23:25:13

+0

Ooh,嵌套的動態SQL。撒旦,讓我在身後! (雖然它可能會工作......) – 2012-01-07 00:04:06

0

請檢查sp_msforeachdb程序以循環所有數據庫:

Take advantage of undocumented SQL Server iteration procedures

+0

你仍然有問題「CREATE VIEW可以是批處理中唯一的語句」,這是相關的,因爲他需要代碼來確定他是否要在* this中運行它*數據庫(即像[IF]'?''這樣的語法,就像[數據庫列表]一樣 – 2012-01-07 00:05:58

相關問題