循环数据库时会产生不一致的游标结果

时间:2010-10-29 00:22:33

标签: tsql sql-server-2008 cursors

我有几个名为非常相似的数据库(my-db-1,my-db-2,my-db-3,my-db-4)。我想在每个这些数据库上执行相同的存储过程。我决定使用游标。但是,我遇到了一些奇怪的问题。首先是我通过SQL Server Management Studio 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秒内连续多次执行此操作,我得到了奇怪的结果:

Execution1:

my-db-1
my-db-2
my-db-3
my-db-4

Execution2:

my-db-1
my-db-2

Execution3:

my-db-1
my-db-2
my-db-3
my-db-4

Execution4:

my-db-1

它似乎完全随机。有时我会在10次执行后打印所有4个数据库。有时仅执行2次后,只会打印1个数据库。

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

有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

尝试将光标声明为FAST_FORWARD

默认值是可更新游标,这些必需的更新锁可能与访问sys.databases的其他进程冲突

参考:DECLARE CURSOR