wildflower 0 Geschrieben 1. August 2014 Melden Teilen Geschrieben 1. August 2014 Hallo zusammen, habe folgendes Problem: Ich möchte eine Abfrage in mehreren Datenbanken machen, kriege das aber nur teilweise hin. Auf dem Server gibt es für jeden Kunden eine Datenbank. Die DBs haben immer exakt die gleichen Tabellen und ihr Name beginnt immer gleich, also gibt es z.B. eine DB kde_01_Meier, eine kde_02_Mueller etc. Nun möchte ich z.B. in jeder Datenbank abfragen, was in der Tabelle "Stammdaten" drin steht und das mit einem Script, welches über alle DBs läuft. Nach einigem Suchen ist mein Ansatz dieser: DECLARE @name VARCHAR(100) -- database name DECLARE @befehl nvarchar(200) DECLARE db_cursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name like 'kde_0%' order by name OPEN db_cursor FETCH NEXT FROM db_cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN set @befehl = 'use [' + @name + ']' exec sp_executesql @befehl /* Abfrage Anfang */ select bezeichnung from dbo.stammdaten /* Abfrage Ende */ FETCH NEXT FROM db_cursor INTO @name END CLOSE db_cursor DEALLOCATE db_cursor Damit wird aber nur eine Abfrage auf die DB gemacht, auf der ich gerade stehe. Die Schleife läuft also so oft durch, wie es DBs gibt (bei 10 DBs also 10 Mal) und ich bekomme 10 Mal das gleiche Ergebnis. Irgendwie stimmt etwas mit dem USE nicht. Kann ich USE nicht so verwenden? Eine andere Möglichkeit, die funktioniert, habe ich hinbekommen. Die WHILE-Schleife habe ich so umgebaut: WHILE @@FETCH_STATUS = 0 BEGIN set @befehl = 'select bezeichnung from ' + QUOTENAME(@name) + '.dbo.stammdaten' exec sp_executesql @befehl FETCH NEXT FROM db_cursor INTO @name END Das erscheint mir aber etwas umständlich, da ich für jede Tabelle das QUOTENAME(@name) brauche. Habt ihr hier eine Idee, was falsch ist, bzw. wie ich's besser machen könnte? Vielen Dank! Zitieren Link zu diesem Kommentar
hh2000 10 Geschrieben 16. September 2014 Melden Teilen Geschrieben 16. September 2014 (bearbeitet) Moin, Cursor sollten nur für Probleme genutzt werden, die nicht mit "normalen" SQL gelöst werden können (mengenbasiert <> zeilenorientiert). Korrekte Rechte auf den verschiedenen Datenbanken vorausgesetzt, könnte das so aussehen (Vollqualifizierter Bezeichner): SELECT * FROM DB1.dbo.stammdaten UNION ALL SELECT * FROM DB2.dbo.stammdaten UNION ALL SELECT * FROM DB3.dbo.stammdaten ... siehe auch SQL-Onlinehilfe "Bezeichner" Gruß Kai bearbeitet 16. September 2014 von hh2000 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.