我已经看到了一些看起来应该没问题的生产代码,并且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,如果你没有按名称订购,但没有任何迹象表明这种失败情况。我想我们可能处于罕见的情况,因为内部部分可能需要很长时间才能运行?
我想知道是否有其他人见过这个。我正计划重写它以选择一个临时表和游标来代替它。
答案 0 :(得分:3)
这是我的一个非常古老的问题,但答案是,如果你正在迭代Sys.Databases,你的光标类型应该是STATIC。
否则,如果在迭代它(即备份等)时该表发生了某些事情,它可以跳过数据库。与sp_MSForeachDB相同。
谢天谢地,我们很久以前就过去了。是的,NOLOCK被取出了。
答案 1 :(得分:1)
虽然没有记录,但sp_MSForeachDB提供了一种针对所有DB执行查询的好方法。这种方法有帮助吗?
EXEC sp_MSForeachDB '
SELECT * FROM [?].sys.tables
'