我有几个命名非常相似的数据库(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) 2010 年 4 月 2 日 15:48:46 版权所有 (c) Microsoft Corporation Developer Edition(64 位)在 Windows NT 6.1(Build 7600:)通过 Microsoft SQL Server Management Studio 10.50.1600.1
有没有人有任何想法?
最佳答案
尝试将光标声明为 FAST_FORWARD
.
默认值是一个可更新的游标,这些所需的更新锁可能与另一个访问 sys.databases
的进程发生冲突。
引用:DECLARE CURSOR
关于tsql - 循环遍历数据库时出现不一致的游标结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4048147/