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