2016-09-05 4 views
1

Ich weiß, dass mein Beitrag einen sehr ähnlichen Titel zu anderen in diesem Forum hat, aber ich konnte wirklich nicht die Antwort finden, die ich brauche.Ausführen von SQL-Abfrage für mehrere Datenbanken

Hier ist mein Problem, ich habe einen SQL Server auf meinem Windows Server ausgeführt. In meinem SQL Server habe ich ungefähr 30 Datenbanken. Alle von ihnen haben die gleichen Tabellen und die gleichen gespeicherten Prozeduren.

Nun, hier ist das Problem, ich habe dieses riesige Skript, das ich in all diesen Datenbanken ausführen muss. Ich wünschte, ich könnte es nur einmal gegen alle meine Datenbanken tun.

Ich habe versucht, ein paar Dinge wie "Ansicht" >> registrierte Server >> lokale Servergruppen >> neue Serverregistrierung gehen. Aber diese Lösung ist für viele Server, nicht für viele Datenbanken.

Ich weiß, ich könnte es tun, indem Sie den Datenbanknamen eingeben, aber die Abfrage ist wirklich riesig, so würde es zu lange dauern, um in allen Datenbanken zu laufen.

Hat jemand eine Idee, wenn das möglich ist?

+1

Sie können die Zeit nicht verkürzen benötigt, um die Abfrage für verschiedene Datenbanken auszuführen. Dies scheint ein [Duplikat der Frage auf DBA] (http://dba.stackexchange.com/questions/907/how-to-execute-sql-against-all-dbs-on-a-server) zu sein, was sollte help you out :-) –

+0

Warum dauert die Eingabe des Datenbanknamens lange in allen Datenbanken? – GuidoG

+0

Sie können EXEC sp_MSforeachdb @stored_procedure verwenden. , –

Antwort

4

ApexSQL Propagate ist das Werkzeug, das in dieser Situation helfen kann. Es wird verwendet, um einzelne oder mehrere Skripte für mehrere Datenbanken, sogar für mehrere Server, auszuführen.Was sollten Sie tun einfach ist das Skript aus, und wählen Sie alle Datenbanken, an denen Sie das Skript ausführen möchten:

select databases

Wenn Sie Skripte und Datenbanken laden sollten Sie klicken Sie einfach auf die Schaltfläche „Ausführen“, und warten Sie die Ergebnisse:

click the execute button

1

dies ist der normale Weg, dies zu tun:

dass Sie eine Auswahl auf Datenbank DBOther tun wollen, als es sein würde:

select * from DBOther..TableName 

auch überprüfen, ob die Tabelle oder Sicht auf ist das dbo-Schema, wenn Sie nicht auch das Schema hinzufügen sollen: Bitte bemerke ich jetzt nach dem Datenbanknamen

select * from DBOther.dbo.ViewName 

wenn ein nur einen Punkt verwenden y der Datenbanken befindet sich auf einem anderen Server auf einem anderen Rechner, als sicherstellen, dass sich die Datenbank im Verbindungsserver befindet.
Dann können Sie die Tabelle oder Ansicht Zugriff auf die Datenbank über:

SELECT * FROM [AnotherServerName].[DB].[dbo].[Table] 

Hier ist eine andere Art und Weise, die nicht erfordert den Datenbanknamen eingeben:

use DB1 
go 

select * from table1 
go 

use DB2 
go 

select * from table1 
go 

Beachten Sie, dass dies nur funktioniert, Wenn die Tabellen und Felder in jeder Datenbank exakt gleich sind

2

Sie können ein Skript wie dieses schreiben

DECLARE CURSOR_ALLDB_NAMES CURSOR FOR 
SELECT name 
FROM Sys.Databases 
WHERE name NOT IN('master', 'tempdb') 

OPEN CURSOR_ALLDB_NAMES 

FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME 

WHILE @@Fetch_Status = 0 
BEGIN 
    EXEC('UPDATE '+ @DB_NAME + '..SameTableNameAllDb SET Status=1') 
    FETCH CURSOR_ALLDB_NAMESINTO INTO @DB_NAME 
END 

CLOSE CURSOR_ALLDB_NAMES 
3

Sie können das Skript in SQLCMD Mode von SSMS ausführen (Query - SQLCMD-Modus). Auf diese Weise können Sie das Skript in einer Datei speichern und es im Zusammenhang mit jeder der gewünschten Datenbanken laufen leicht:

USE DB1; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
USE DB2; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
USE DB3; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
+0

Dan Guzman, ich denke, Ihr Vorschlag wäre der beste Weg, dies zu tun, da meine Datei etwa 45000 Zeilen Code enthält. Ich werde es versuchen und ich lasse es alle wissen! Vielen Dank –

0

Dan Antwort mein Problem gelöst! Nur eine Beobachtung, ich musste den SQLCMD-Modus auf der Registerkarte Abfrage in SQL Server Management aktivieren. Außerdem darf der Pfad der Datei keine Leerzeichen enthalten. Ich schätze Ihre Hilfe!

+0

Bitte verschieben Sie Ihren Kommentar zu beantworten Sie kommentieren. Dies ist keine Antwort für sich. – Oliver

+0

Hey @Oliver, es tut mir leid, aber ich habe nicht verstanden, was ich tun soll. Du willst, dass ich meine Antwort lösche und sie als Kommentar von jemandes Antwort poste, ist das richtig? –

+0

Ja, @Arthur, das ist was ich vorschlage :-) – Oliver