Tsql 在数据库上循环时光标结果不一致

Tsql 在数据库上循环时光标结果不一致,tsql,sql-server-2008,cursors,Tsql,Sql Server 2008,Cursors,我有几个名为非常相似的数据库(my-db-1、my-db-2、my-db-3、my-db-4)。我希望在每个数据库上执行相同的存储过程。我决定使用游标。然而,我遇到了一些奇怪的问题。首先是我通过SQLServerManagementStudio 2008执行的简单代码 DECLARE @db_cursor CURSOR DECLARE @name varchar(255) DECLARE @Sql nvarchar(4000) SET @db_cursor = CURSOR FOR SE

我有几个名为非常相似的数据库(my-db-1、my-db-2、my-db-3、my-db-4)。我希望在每个数据库上执行相同的存储过程。我决定使用游标。然而,我遇到了一些奇怪的问题。首先是我通过SQLServerManagementStudio 2008执行的简单代码

DECLARE @db_cursor CURSOR 
DECLARE @name varchar(255)
DECLARE @Sql nvarchar(4000)

SET @db_cursor = CURSOR FOR  
SELECT name FROM sys.databases WHERE name LIKE 'my-db-%'

OPEN @db_cursor   
FETCH NEXT FROM @db_cursor INTO @name   

WHILE @@FETCH_STATUS = 0   
BEGIN  

    SET @Sql = 'Use [' + @name + ']; PRINT DB_NAME();'
    exec sp_sqlexec @Sql

    FETCH NEXT FROM @db_cursor INTO @name   
END   

CLOSE @db_cursor   
DEALLOCATE @db_cursor
在2秒内连续多次执行此操作,会得到奇怪的结果:

执行1:

my-db-1
my-db-2
my-db-3
my-db-4
执行2:

my-db-1
my-db-2
执行3:

my-db-1
my-db-2
my-db-3
my-db-4
执行4:

my-db-1
这似乎是完全随机的。有时我会在执行10次后打印所有4个数据库。有时仅执行两次后,将只打印一个数据库

此SQL正在Microsoft SQL Server 2008 R2(RTM)-10.50.1600.1(X64)2010年4月2日15:48:46通过Microsoft SQL Server Management Studio 10.50.1600.1在Windows NT 6.1(Build 7600:)上执行版权所有(c)Microsoft Corporation Developer Edition(64位)


有人有什么想法吗?

尝试将光标声明为“快进”

默认为可更新游标,这些所需的更新锁可能与另一个访问
sys.databases


参考资料:

这似乎解决了问题。非常感谢。