4

我有几个命名非常相似的数据库(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 秒内连续多次执行此操作,我得到奇怪的结果:

执行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 个数据库。有时仅执行 2 次后,只会打印 1 个数据库。

此 SQL 在 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 版权所有 (c) Microsoft Corporation Developer Edition (64-bit) o​​n Windows NT 6.1 (Build 7600: )通过 Microsoft SQL Server Management Studio 10.50.1600.1

有没有人有任何想法?

4

1 回答 1

1

尝试将光标声明为FAST_FORWARD.

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

参考:声明光标

于 2010-10-29T01:42:02.467 回答