2016-08-03 24 views
1

Es muss eine IN-Klausel mit einer Liste von Daten darin erstellt werden. Die Liste muss in absteigender Reihenfolge sein. Ich habe eine Variable mit dem Namen @cols und ich versuche es mit diesem Code zu füllen:Verwenden einer While-Schleife in SQL zum Erstellen einer Variablen

declare @end date='2016/05/30' 
declare @begin date = DATEADD(month, DATEDIFF(month, 0, @end), 0) ; 
declare @curdate date = @end; -- start on the last day 
print @curdate; 
print @begin; 

DECLARE @cols NVARCHAR (MAX) 

while @curdate >[email protected] -- goes from end of the month to beginning of the month 
begin 
    select @cols = @cols + ',[' + CONVERT(NVARCHAR, @curdate, 106) + ']'; 
    select @curdate = DATEADD(DAY,-1,@curdate) -- subtract a day 
end 

print @cols; 
print @curdate; 
print @begin; 

Ich hoffe 5/30/16 zu bekommen, 5/29/16, 5/28/16 etc (richtig formatiert natürlich). Der Code läuft ohne Fehler aber @cols ist immer leer.

+3

Sie sollten sich mit einer Tally-Tabelle vertraut machen. Sie sollten in solchen Fällen statt einer Schleife verwenden. http://www.sqlservercentral.com/articles/T-SQL/62867/ –

Antwort

5

Der Grund dafür, dass Sie eine NULL@Cols erhalten, ist, dass ihr vor dem Eintritt in die while-Schleife kein Wert zugewiesen wurde. Es ist immer noch NULL und NULL + alles = NULL.

Um dies zu beheben, können Sie @Cols gleich eine leere Zeichenfolge vor der while-Schleife gesetzt:

DECLARE @cols NVARCHAR (MAX) = '' 
0

Warum Sie eine Liste von Daten zu einer IN-Klausel vorbei? Können Sie nicht einfach einen einfachen Zeitraum wie unten verwenden?

DECLARE @enddate = '2016-05-30' 

SELECT * 
FROM sometable 
WHERE somedate >= DATEADD(month, DATEDIFF(month, 0, @enddate), 0) 
    AND somedate < EOMONTH(@enddate) 
+0

Dies ist eine gute Idee, aber ich brauche eine Liste von Daten als Teil einer In-Klausel in einer Pivot-Tabelle. – Missy