2012-02-08 14 views
3

需要更新我們服務器上的所有數據庫,並在每個數據庫上執行相同的邏輯。所討論的數據庫都遵循像CorpDB1,CorpDB2等通用的命名方案,而不是爲每個有問題的數據庫(超過50個)創建SQL Agent作業,我曾考慮過使用遊標遍歷數據庫列表然後在每一個上執行一些動態的sql。鑑於遊標應該是最後的手段這一常見概念;這可以改寫爲更好的表現或寫入另一種方式,也許使用無證sp_MSforeachdb stored procedure爲了獲得最佳性能,可以對此光標進行優化或重寫嗎?

DECLARE @db VARCHAR(100) --current database name 
DECLARE @sql VARCHAR(1000) --t-sql used for processing on each database 

DECLARE db_cursor CURSOR FAST_FORWARD FOR 
    SELECT name 
    FROM MASTER.dbo.sysdatabases 
    WHERE name LIKE 'CorpDB%' 
OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @db 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = 'USE ' + @db + 
    ' DELETE FROM db_table --more t-sql processing' 
    EXEC(@sql) 
    FETCH NEXT FROM db_cursor INTO @db 
END 
CLOSE db_cursor 
DEALLOCATE db_cursor 
+1

'sp_msforeachdb'和'sp_msforeachtable'都只是遊標的包裝,無論如何一些性能差異應該是最小的。 – JNK 2012-02-08 16:54:19

+0

嘿去圖..我從來沒有打開他們看他們做了什麼,但這並不令我感到驚訝。 – CheckRaise 2012-02-08 17:12:40

+2

我不認爲你會使用這樣的遊標來打亂SQL神。光標的預取不會讓你的服務器停下來,這是你對它做了什麼以及多久。在這種情況下,你將循環50行。我認爲這比我能想出的任何替代方案都要好。 – 2012-02-08 17:21:50

回答

5

遊標在用過程代碼解決基於集合的問題時很糟糕。我不認爲在你的場景中光標不一定是個壞主意。

當需要針對多個數據庫(備份,完整性檢查,索引維護等)運行操作時,使用遊標沒有問題。當然,你可以建立一個包含數據庫名稱的臨時表,並通過循環...但它仍然是一個程序方法。

對於您的具體情況,如果您沒有根據子條件條件刪除這些表中的行,請考慮使用TRUNCATE TABLE而不是DELETE FROM。兩項行動之間的差異解釋爲here。請注意,運行TRUNCATE TABLE的用戶需要受影響對象的ALTER權限。

+0

這是很好的信息,我一定會記住將來使用。在這個特定的實例中,delete語句將有一個where子句。爲了簡潔起見,我將它放在了外面。 – CheckRaise 2012-02-08 19:43:05

2

這將收集一組刪除語句,並以單一順序運行它們。這不一定會更好的表現明智,但只是皮膚貓的另一種方式。

DECLARE @sql NVARCHAR(MAX); -- if SQL Server 2000, use NVARCHAR(4000) 

SET @sql = N''; 

SELECT @sql = @sql + N';DELETE ' + name + '..db_table -- more t-sql' 
    FROM master.sys.databases 
    WHERE name LIKE N'CorpDB%'; 

SET @sql = STUFF(@sql, 1, 1, ''); 

EXEC sp_executesql @sql; 

您可以考慮建設一個類似的方式串光標內,而不是針對每個命令運行EXEC()內。如果你想繼續使用遊標,請使用以下聲明:

DECLARE db_cursor CURSOR 
    LOCAL STATIC FORWARD_ONLY READ_ONLY 
    FOR 

這將有至少鎖定並沒有不必要的tempdb的使用情況。

+0

我很欣賞你的另一種方法。我希望我可以將兩者都標記爲可能的答案! – CheckRaise 2012-02-08 19:44:53

+0

此外,如果無證/不支持不足以阻止您使用'sp_msforeachdb',請查看http://sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/a-more-reliable-and -more-flexible-sp-msforeachdb.aspx和http://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/ – 2012-02-08 19:50:13

相關問題