2010-07-22 8 views
1

Disons que j'ai un script de mise à jour:Exécuter un script sur plusieurs bases de données (SQL Server)?

update sometable set somecolumn = 'somevalue' where xyz = 0 

Maintenant, nous allons dire que j'ai plusieurs bases de données, comme DB1, DB2, DB3 et ainsi de suite. Comment est-ce que je pourrais courir ce manuscrit sur chacun d'eux sans le faire manuellement?

Merci :)

+0

vérifier la réponse mise à jour –

Répondre

1

Si vous voulez que toutes les bases de données, vous pouvez utiliser sp_MSforeachdb:

http://www.databasejournal.com/features/mssql/article.php/3441031/SQL-Server-Undocumented-Stored-Procedures-spMSforeachtable-and-spMSforeachdb.htm

EXEC sp_MSforeachdb @command1="UPDATE ?..sometable SET somecolumn='somevalue' WHERE xyz=0" 

ou des bases de données spécifiques, vous pouvez essayer une partie de la logique comme on le voit ici:

http://www.sqlservercurry.com/2009/04/6-common-uses-of-undocumented-stored.html

espoir qui aide.

+0

C'est une fonctionnalité intéressante, aussi! – grady

+0

Les procédures stockées non documentées ne sont pas recommandées pour une utilisation autre que les scénarios ad hoc, car elles peuvent être modifiées ou supprimées à tout moment. Vous pouvez toujours rouler votre propre facilement. –

2

Vous pouvez le faire en utilisant le curseur

  • get liste de tous les serveurs de votre réseau local ou en réseau

  • créer le curseur pour que

  • Than utiliser sp_executesql pour exécuter le script de mise à jour avec la requête forpart

    set ANSI_NULLS ON 
    set QUOTED_IDENTIFIER ON 
    GO 
    
    CREATE PROCEDURE [sp_cross_db_query] 
    @SQLQuery varchar(400) 
    AS 
    
    DECLARE @DB_Name varchar(100) 
    DECLARE database_cursor CURSOR FOR 
    
    SELECT DatabaseName 
    FROM Management.dbo.Customers 
    
    OPEN database_cursor 
    
    FETCH NEXT FROM database_cursor INTO @DB_Name 
    
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
        exec(
         'USE [' + @DB_Name + '];' + 
         @SQLQuery 
         ) 
         FETCH NEXT FROM database_cursor INTO @DB_Name 
    END 
    CLOSE database_cursor 
    DEALLOCATE database_cursor 
    

    pour exécuter la requête

    exec sp_cross_db_query 'SELECT count(*) FROM Products' 
    
+0

Merci, pouvez-vous me donner un SQL s'il vous plaît? – grady

+0

vérifier la mise à jour la réponse –

+0

Merci, À partir de Management.dbo.Customers provoque certains problèmes ... Qu'est-ce qui ne va pas? – grady

Questions connexes