2016-03-31 13 views
2

Ich habe eine große SQL Server 2012-Datenbank, die ich 3 Tabellen abfragen, um eine Ergebnismenge von 5 Feldern zu erstellen.Iterative Union ALL

Ich möchte diese Abfrage in einer WHILE - Schleife und "UNION ALL" die in jeder Schleife erhaltenen Ergebnismengen wiederholen. Diese Iteration wird auf einer Variablen liegen: @this_date, die in den letzten 6 Jahren erhöht wird und am heutigen Datum aufhört.

Bei jeder Iteration wird durch SELECT eine andere Ergebnismenge erhalten.

So wie folgt Ich versuche, die gespeicherte Prozedur zu kodieren:

Declare @the_date as Date, 
     @to_date as Date 

-- I setup the above dates, @the_date being 6 years behind @to_date 
-- Want to loop for each day over the 6-year period 


WHILE (@the_date <= @to_date) 
BEGIN 

-- the basic select query looks like this 

Select Table1.Field-1, Table2.Field-2 ... 
FROM Table1 
Inner Join Table2 ... 
On (..etc.. ) 

-- the JOIN conditions are based on table.attributes which are compared with 
-- @the_date to get a different result set each time 

-- now move the date up by 1 

DateAdd(Day, +1, @the_date) 

-- want to concatenate the result sets 

UNION ALL 
END 

Das gibt mir oben eine Fehler Syntax:

Incorrect syntax near the keyword 'Union'.

Irgendwelche Ideen auf eine Lösung für mein Problem zu begrüßen wäre - Vielen Dank.

+0

Ergebnis aus der Schleife in eine Tabelle variabel einfügen und daraus auswählen. – artm

+0

Was möchten Sie erreichen? Willst du die Aufzeichnungen von '@ This_date' und 6 Jahren nach ihm? Wenn Sie Ihr Ziel klar formulieren können, kann ich eine Antwort geben, die kein Looping beinhaltet. –

+0

Wie wird '@ this_date' in Ihrer Anfrage verwendet? – Squirrel

Antwort

1

Verwenden Sie keine UNION. Sie können sowieso nicht in einer Schleife sein. Speichern Sie stattdessen die Ergebnisse jeder Iteration in einer temporären Tabelle oder einer Tabellenvariablen und wählen Sie stattdessen die temporäre Tabelle/Tabellenvariable aus.

DECLARE @the_date as Date, 
     @to_date as Date 

CREATE TABLE #t (Col1 VARCHAR(100)) 

WHILE (@the_date <= @to_date) 
BEGIN 
    INSERT #t (Col1) SELECT ... etc 
    DateAdd(Day, +1, @the_date) 
END 

SELECT Col1 FROM #t 

Das heißt, wenn Sie einige Beispieldaten liefern und die erwarteten Ergebnisse, die wir in der Lage, um Sie mit einem effizienteren Set-basierte Lösung zu helfen. Sie sollten iterative Schleifen in RDBMS nach Möglichkeit vermeiden.

+0

Haben Sie meine Lösung mit einer Tabelle #Temp - danke. – MaxR