2016-07-14 40 views
0

Mit MS SQL 2008 R2, Ich habe eine Abfrage, die Cte ​​verwendet, um meine gewünschte Ausgabe zu erstellen. Dies funktioniert gut für eine Datenbank, aber jetzt muss ich die gleiche Abfrage über mehrere Datenbanken ziehen und alle diese Ergebnisse in einer Ergebnismenge zurückgeben. Ohne extreme Details habe ich:UNION SQL Query auf CTE über mehrere Datenbanken

;with cte1 as (my query from db1), 
cte2 as (another query from cte1), 
cte3 as (yet another one from cte2) 
Select 'db1.Name' as dbName, * from cte3 

Dies gibt mir die Daten, die ich brauche mit der ersten Spalte mit dem zugehörigen db-Namen. Jetzt muß ich diese über mehr als 30 Datenbanken alle mit dem gleichen Schema und demselben Ausgang laufen, aber wenn ich versuche, dies:

;with cte1 as (my query from db1), 
cte2 as (another query from cte1), 
cte3 as (yet another one from cte2) 
Select 'db1.Name' as dbName, * from cte3 

Union (or Union All) 

;with cte1 as (my query from db2), 
cte2 as (another query from cte1), 
cte3 as (yet another one from cte2) 
Select 'db2.Name' as dbName, * from cte3 

Union (or Union All) 

... till we reach the 30+ 

ich Beschwerden über die „;“ und die Gewerkschaft/Union alle. Wie bekomme ich die gesamte Ausgabe der letzten SELECT-Anweisung aus allen Datenbanken in 1 Ergebnismenge?

Antwort

0

CTE Sie auf diese Weise nicht funktionieren ..

Problem erstellen globale temporäre Tabelle zu lösen und den Tisch und am Ende wähle bevölkern.

Ie Probe vorausgesetzt, es gibt zwei Spalte column1 und column2 erzeugt werden aus cte3

CREATE TABLE ##result 
    (dbname varchar(50); 
     column1 varchar(50), 
     column2 varchar(50)) 


    ;with cte1 as (my query from db1), 
    cte2 as (another query from cte1), 
    cte3 as (yet another one from cte2) 

    INSERT INTO ##result (dbname ,column1 ,column2) 
    Select 'db1.Name' as dbName, * into ##result from cte3 

    ;with cte1 as (my query from db1), 
    cte2 as (another query from cte1), 
    cte3 as (yet another one from cte2) 

    INSERT INTO ##result (dbname ,column1 ,column2) 
    Select 'db1.Name' as dbName, * into ##result from cte3 


    select * from ##result ; 
+0

Das ist, was ich brauchte es Ihnen danken, hätte nicht gedacht, eine globale temporäre Tabelle zu verwenden. Jetzt muss ich es nur mit SSRS arbeiten :) Danke für Ihre Hilfe! –