是否可以优化或重写此光标以获得最佳性能?

Che*_*ise 3 t-sql database sql-server cursor

需要更新我们服务器上的所有数据库,并在每个数据库上执行相同的逻辑.有问题的数据库都遵循一个通用的命名方案,如CorpDB1,CorpDB2等.而不是为每个有问题的数据库(超过50个)创建一个SQL代理作业,我考虑过使用游标迭代数据库列表然后在每个上执行一些动态sql.鉴于游标应该是最后手段的普遍观念; 是否可以通过使用未记录的sp_MSforeachdb存储过程来重写以获得更好的性能或以其他方式编写?

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
Run Code Online (Sandbox Code Playgroud)

Bry*_*yan 5

当游标用于处理基于集合的过程代码问题时,游标很糟糕.我认为光标在你的场景中不一定是个坏主意.

当需要针对多个数据库运行操作(备份,完整性检查,索引维护等)时,使用游标没有问题.当然,你可以构建一个包含数据库名称的临时表并循环执行...但它仍然是一种程序方法.

对于您的特定情况,如果您没有根据某些WHERE子句标准删除这些表中的行,请考虑使用TRUNCATE TABLE而不是DELETE FROM.这里解释了两个操作之间的差异.请注意,运行的用户TRUNCATE TABLE需要ALTER受影响对象的权限.