我见过一些生产代码,看起来应该没问题,并且在 80% 的情况下可以正常工作,但另外 20% 的代码似乎会无缘无故地停止返回和迭代数据库列表:
DECLARE c_UserDatabases CURSOR FOR
SELECT Name
FROM Sys.Databases SD (NOLOCK)
ORDER BY Name
OPEN c_UserDatabases
FETCH Next FROM c_UserDatabases INTO @v_DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
-- Query that takes a few minutes to run (using dynamic SQL and EXEC, etc)
FETCH Next FROM c_UserDatabases INTO @v_DatabaseName
END
CLOSE c_UserDatabases
DEALLOCATE c_UserDatabases
这是在 SQL Server 2008 SP3 上。我注意到有文章提到,如果您不按名称订购,则在某些版本上它是不确定的,但没有任何内容表明此故障情况。我认为我们可能处于一种罕见的情况,因为内部部分可能需要很长时间才能运行?
我想知道是否有人看过这个。我计划重写它以选择临时表并通过它来移动光标。
最佳答案
这是我的一个非常老的问题,但答案是,如果您正在迭代 Sys.Databases,您的游标类型应该是 STATIC。
否则,如果在迭代该表时发生某些情况(即备份等),它可能会跳过数据库。与 sp_MSForeachDB 相同。
值得庆幸的是,我们很久以前就已经过去了。是的,NOLOCK 被删除了。
关于sql-server - 游标中的 sys.databases 跳过数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9936970/