需要更新我們服務器上的所有數據庫,並在每個數據庫上執行相同的邏輯。所討論的數據庫都遵循像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
'sp_msforeachdb'和'sp_msforeachtable'都只是遊標的包裝,無論如何一些性能差異應該是最小的。 – JNK 2012-02-08 16:54:19
嘿去圖..我從來沒有打開他們看他們做了什麼,但這並不令我感到驚訝。 – CheckRaise 2012-02-08 17:12:40
我不認爲你會使用這樣的遊標來打亂SQL神。光標的預取不會讓你的服務器停下來,這是你對它做了什麼以及多久。在這種情況下,你將循環50行。我認爲這比我能想出的任何替代方案都要好。 – 2012-02-08 17:21:50