2010-04-30 9 views
1

Au travail, nous avons un certain nombre de bases de données sur lesquelles nous devons effectuer les mêmes opérations. Je voudrais écrire 1 SP qui ferait une boucle sur les opérations et placerait la base de données au début de la boucle (exemple à suivre). J'ai essayé sp_executesql ('USE' + @db_id) mais cela ne fait que définir le DB pour la portée de cette procédure stockée. Je ne veux pas vraiment faire de boucle avec les noms de bases de données codées en dur car nous devons faire des choses similaires dans de nombreux endroits différents et il est difficile de se rappeler où les choses doivent changer si nous ajoutons une autre base de données.Modification dynamique des bases de données dans SQL Server 2000

> Toutes les pensées

Exemple:
DECLARE CURSOR zdb_loop FAST_FORWARD POUR SELECT db_id distinct de l'ordre DBS par db_id

OUVERT zdb_loop FETCH NEXT zdb_loop EN @db_id

ALORS QUE @@ FETCH_STATUS = 0 BEGIN USE @db_id

--Do stuff against 3 or 4 different DBs 

FETCH NEXT FROM zdb_loop INTO @db_id 

FIN

FERMER zdb_loop DEALLOCATE zdb_loop

Répondre

0

Jusqu'à présent, le SQL dynamique est le seul moyen de le faire. Plutôt misérable.

0

Vous pouvez utiliser la procédure stockée sp_MSforeachdb pour cela:

Cet exemple effectuer une sauvegarde base de données , puis un "DBCC CHECKDB" contre chaque base de données:

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

Voici ce que j'ai fait en tant que test: SET @cmd = 'if' '?' '=' 'Int_tables' 'use' '?' '' Je reçois une erreur de syntaxe près de 'master' ... (Je l'ai pour tous les DB). Je vais jouer avec ça un peu aujourd'hui. – spuppett

+0

Changé un peu à: SET @cmd = 'if' '?' '=' 'Int_tables' 'use?' Malheureusement, j'obtiens le même résultat que l'utilisation de SP_executesql, c'est-à-dire qu'il n'utilise que db dans la portée de sp. – spuppett

Questions connexes