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

时间:2012-03-30 04:19:52

标签: sql-server sql-server-2008 tsql 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上。我注意到有些文章提到它在某些版本上是iffy,如果你没有按名称订购,但没有任何迹象表明这种失败情况。我想我们可能处于罕见的情况,因为内部部分可能需要很长时间才能运行?

我想知道是否有其他人见过这个。我正计划重写它以选择一个临时表和游标来代替它。

2 个答案:

答案 0 :(得分:3)

这是我的一个非常古老的问题,但答案是,如果你正在迭代Sys.Databases,你的光标类型应该是STATIC。

否则,如果在迭代它(即备份等)时该表发生了某些事情,它可以跳过数据库。与sp_MSForeachDB相同。

谢天谢地,我们很久以前就过去了。是的,NOLOCK被取出了。

答案 1 :(得分:1)

虽然没有记录,但sp_MSForeachDB提供了一种针对所有DB执行查询的好方法。这种方法有帮助吗?

EXEC sp_MSForeachDB '
    SELECT * FROM [?].sys.tables
'