2010-04-30 2 views
1

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

Любые мысли>

Пример:
DECLARE zdb_loop КУРСОРОМ FAST_FORWARD ДЛЯ ВЫБОР отчетливую db_id от DBS порядке db_id

ОТКРЫТЫЙ zdb_loop FETCH СЛЕДУЮЩИЙ ИЗ zdb_loop НА @db_id

WHILE @@ FETCH_STATUS = 0 BEGIN 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

ответ

0

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

0

Вы можете использовать хранимую процедуру 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 @[email protected], 
        @[email protected], 
        @[email protected] 
+0

Вот что я сделал в качестве теста: SET @cmd = 'if' '?' '=' 'Int_tables' 'use' '?' '' Я получаю синтаксическую ошибку около 'master' ... (Я получаю его для всех БД). Сегодня я собираюсь поиграть с ним. – spuppett

+0

Немного изменил это значение: SET @cmd = 'if' '?' '=' 'Int_tables' 'use?' К сожалению, я получаю те же результаты, что и с использованием SP_executesql, т. Е. Он использует только этот db в рамках sp. – spuppett