tsql - 循环遍历数据库时出现不一致的游标结果

标签 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 秒内连续多次执行此操作,我得到奇怪的结果:

执行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/

相关文章:

sql-server - SQL 中的逗号分隔结果

sql - 没有系统管理员权限的 OpenRowSet 和 OpenDataSet

Mysql游标替代/优化-每行更新太慢

c# - 如何在cs文件的下拉列表中添加项目

c# - Entity Framework : Database. ExecuteSqlCommand 方法

c# - 自定义游标中的内存泄漏

sql - 检查时间范围重叠,watchman 问题 [SQL]

sql-server - 有没有一种方法无需在 SQL Server 中进行转换即可获取 bool 值?

sql - 是否可以按行组合进行分组?