sql-server - 游标中的 sys.databases 跳过数据库

标签 sql-server sql-server-2008 t-sql cursor

我见过一些生产代码,看起来应该没问题,并且在 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/

相关文章:

sql - 在 SQL 中分组之前合并结果

java - 无法将语言特定字符保留到 xml 数据类型的数据库列中

sql-server - 从 SELECT 创建数据库名称

sql - 基于 TSQL/Microsoft SQL Server 中的另一个字段对字段值进行透视

SQL使用2个不同的表对数据进行排序

sql-server - "FOR XML EXPLICIT"Msg 6833 "requires parent tags to be opened first"Error 故障排除建议

sql-server - 手动删除 tempdb.mdf 文件是否安全?

c# - 在代码中复制 SQL Server 数据库

sql-server - SQL Server 合并功能 - 删除和输出删除无法正常工作

c# - 动态列出数据库表中的字段