【发布时间】:2012-02-08 16:49:24
【问题描述】:
需要更新我们服务器上的所有数据库并在每个数据库上执行相同的逻辑。有问题的数据库都遵循一个通用的命名方案,如 CorpDB1、CorpDB2 等。我没有为每个有问题的数据库(超过 50 个)创建 SQL 代理作业,而是考虑使用游标来遍历数据库列表然后对每个执行一些动态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都只是游标的包装,无论如何,一些性能差异应该是最小的。 -
嘿,想想看。我从来没有打开它们看看他们做了什么,但这并不让我感到惊讶。
-
我不认为你会因为使用这样的游标而惹恼 SQL 之神。光标的存在不会使您的服务器停止,这是您使用它的方式和频率。在这种情况下,您将循环 50 行。我认为这比我能想到的任何替代方案都要好。
-
对于指定 SQL Server 的 版本 总是有用的。
标签: sql-server database tsql cursor