Wenn auf einem SQL-Server hunderte Kundendatenbanken vorhanden sind, kann es vorkommen, dass wir einen bestimmten Wert über alle Datenbanken suchen möchten oder ein Update Statement auf allen DBs ausführen müssen um z.B. eine Einstellung zu setzen. Bei Cloud Applikationen (multitenant, multi-db) kommt das schon ab und zu mal vor. Ein Beispiel wäre der, dass man prüfen möchte welcher Kunde eine bestimmte Einstellung in unseren App verwendet.
Um ein SQL Statement auf allen Datenbanken auf dem Server auszuführen, egal ob es um ein SELECT, INSERT, UPDATE oder DELETE Statement handelt, können wir wie folgt vorgehen. Wobei ich auf keinen Fall ein DELETE Statement über alle Datenbanken ausführen würde! Ich persönlich verwende das ausschließlich für SELECT Statements!
Indem wir alle aktive Datenbanken auf dem Server selektieren, können wir im ersten Schritt die auszuführende Statements vorbereiten und im zweiten Schritt die Ausgabe kopieren und ausgeführt.
Mit folgenden Statement erzeugen wir die SQL Statements die wir anschließend ausführen werden. Hier wird das Statement, das wir später ausführen möchten, erstmal als String vorbereitet. In diesem Beispiel handelt es sich um ein SELECT:
SELECT 'SELECT '''+name+''' as kunde, einstellung, wert FROM ['+name+'].dbo.einstellungen WHERE einstellung = 5'
FROM master.sys.databases
WHERE state = 0 and name NOT IN ('master','tempdb', 'model','msdb')
Das Statement erzeugt z.B. die folgende Ausgabe:
SELECT 'KD1' as kunde, einstellung, wert FROM [KD1].dbo.einstellungen WHERE einstellung = 5;
SELECT 'KD2' as kunde, einstellung, wert FROM [KD2].dbo.einstellungen WHERE einstellung = 5;
SELECT 'KD3' as kunde, einstellung, wert FROM [KD3].dbo.einstellungen WHERE einstellung = 5;
SELECT 'KD4' as kunde, einstellung, wert FROM [KD4].dbo.einstellungen WHERE einstellung = 5;
.....
Diese Ausgabe kopieren wir und führen anschließend die generierte Statements aus.
Die master.sys.databases Tabelle enthält eine Liste aller Datenbanken auf dem Server. Die master, tempdb, model und msdb sind Systemdatenbanken und diese schließen wir aus. Bei Bedarf kann diese Liste erweitert werden. Wir prüfen auch auf state = 0 um nur die Datenbanken mit Status „ONLINE“ zu selektieren.