Динамически изменяющиеся базы данных в SQL Server 2000 - PullRequest
1 голос
/ 01 мая 2010

На работе у нас есть несколько баз данных, с которыми нам нужно выполнить те же операции. Я хотел бы написать 1 SP, который будет циклически выполнять операции и установить базу данных в начале цикла (пример для подражания). Я попытался sp_executesql ('USE' + @db_id), но это только устанавливает DB для области действия этой хранимой процедуры. На самом деле я не хочу зацикливаться на жестко закодированных именах баз данных, потому что нам нужно делать похожие вещи во многих разных местах, и сложно вспомнить, где что-то нужно изменить, если мы добавим другую БД.

Любые мысли>

Пример:
ОБЪЯВИТЬ zdb_loop CURSOR FAST_FORWARD FOR ВЫБЕРИТЕ отдельный db_id из порядка DBS по db_id

OPEN zdb_loop ПОЛУЧИТЬ СЛЕДУЮЩУЮ ОТ zdb_loop INTO @ db_id

WHILE @@ FETCH_STATUS = 0 НАЧАТЬ USE @ db_id

--Do stuff against 3 or 4 different DBs

FETCH NEXT FROM zdb_loop INTO @db_id

END

ЗАКРЫТЬ zdb_loop DEALLOCATE zdb_loop

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Пока что похоже, что динамический SQL - единственный способ сделать это. Довольно хромой.

0 голосов
/ 01 мая 2010

Вы можете использовать хранимую процедуру sp_MSforeachdb для этого:

Этот пример будет выполнять базу данных резервное копирование, а затем "DBCC CHECKDB" против каждая база данных:

declare @cmd1 varchar(500)
declare @cmd2 varchar(500)
declare @cmd3 varchar(500)
set @cmd1 =
   'if ''?'' <> ''tempdb'' print ''*** Processing DB ? ***'''
set @cmd2 = 'if ''?'' <> ''tempdb'' backup database ? to disk=''c:\temp\?.bak'''
set @cmd3 = 'if ''?'' <> ''tempdb'' dbcc checkdb(?)'
exec sp_MSforeachdb @command1=@cmd1, 
                    @command2=@cmd2,
                    @command3=@cmd3
...