Непоследовательные результаты курсора при зацикливании баз данных - PullRequest
4 голосов
/ 29 октября 2010

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

Выполнение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 выполнений.Иногда после двух выполнений будет напечатана только 1 база данных.

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

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

1 Ответ

0 голосов
/ 29 октября 2010

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

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

Ссылка: DECLARE CURSOR

...