Несогласованные результаты курсора при циклическом обходе баз данных

У меня есть несколько баз данных с очень похожими именами (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

Кажется, что это совершенно случайно. Иногда я получаю все 4 базы данных для печати после 10 выполнений. Иногда после всего 2-х выполнений будет напечатана только 1 база данных.

Этот SQL выполняется на Microsoft SQL Server 2008 R2 (RTM) — 10.50.1600.1 (X64) 2 апреля 2010 г. 15:48:46 Авторские права (c) Microsoft Corporation Developer Edition (64-разрядная версия) в Windows NT 6.1 (сборка 7600:) через Microsoft SQL Server Management Studio 10.50.1600.1

У кого-нибудь есть идеи?


person smoak    schedule 29.10.2010    source источник


Ответы (1)


Попробуйте объявить курсор как FAST_FORWARD.

По умолчанию используется обновляемый курсор, и эти обязательные блокировки обновления, вероятно, конфликтуют с другим процессом, обращающимся к sys.databases.

Ссылка: ОБЪЯВЛЕНИЕ КУРСОРА

person Mitch Wheat    schedule 29.10.2010
comment
Кажется, это исправить. Спасибо. - person smoak; 29.10.2010