2016-07-10 10 views
0

Ich versuche, dynamische SQL zu lernenLearning Dynamische SQL

Ich habe ein grundlegendes Beispiel einrichten, und ich bin fest, ich verstehe nicht, warum die @Month Variable wird nicht Update mit jeder Schleife. Hier

ist das Beispiel, das ich gemacht:

declare @M int = 1 
declare @SQL varchar(max) = '' 
declare @Cnt int = 1 
declare @Month varchar(25) = (datename(m, '2016-' + convert(varchar(2), @M) + '-01')) 

while @Cnt <= 12 
begin 
    set @SQL = @SQL + 'select ' + convert(varchar(25), @M) + ' as M, ''' + @Month + ''' as Month' 
    if @Cnt <> 12 set @SQL = @SQL + ' Union All ' 
    set @Cnt = @Cnt + 1 
    set @M = @M + 1 
end 

exec (@SQL) 

Die Ergebnisse:

M Month 
1 January 
2 January 
3 January 
4 January 
5 January 
6 January 
7 January 
8 January 
9 January 
10 January 
11 January 
12 January 

Ich suche die das Monthname von Januar bis Dezember

Warum funktioniert der Monatsname nicht zu erzeugen, Aktualisieren Sie jede Schleife? Macht mich verrückt und ich kann nicht warten, bis ich morgen zur Arbeit komme, um meinen Chef zu fragen. Müssen heute Nacht schlafen.

sehr geschätzt.

+0

Blick auf die SQL, die produziert wird und schließen es in der Frage. Ich bin mir ziemlich sicher, dass das Problem offensichtlich ist, wenn Sie '@ SQL' ausdrucken. –

+0

Hier ist die Ausgabe Abfrage, Es ist nicht so offensichtlich für mich .. Wählen Sie 1 als M, 'Januar' als Monat Union Alle wählen Sie 2 als M, 'Januar' als Monat Union Alle wählen Sie 3 als M, 'Januar 'als Monat Union Alle wählen Sie 4 als M,' Januar 'als Monat Union All .... usw. Ich weiß nicht, warum die @Month nicht aktualisiert –

Antwort

0

Sie die @m vorgerückt. aber nicht der Name des Monats:

declare @M int = 0 
declare @SQL varchar(max) = '' 
declare @Cnt int = 1 
declare @Month varchar(25) 

while @Cnt <= 12 
begin 
    set @M = @M + 1 
    set @Month = datename(m, '2016-' + convert(varchar(2), @M) + '-01') 
    set @SQL = @SQL + 'select ' + convert(varchar(25), @M) + ' as M, ''' + @Month + ''' as Month' 
    if @Cnt <> 12 set @SQL = @SQL + ' Union All ' 
    set @Cnt = @Cnt + 1 



end 

exec (@SQL) 
+0

Danke, das ist perfekt. Ich sehe was du getan hast. –

0

Sie müssen das Datum jedes Mal in einer Schleife hinzufügen, genau wie eine Variable @M. nimm eine andere Variable für das Datum.

DECLARE @SQL varchar(max) = '' 
DECLARE @Cnt int = 1 
DECLARE @TempDate DateTime = Cast('2016-03-01' As DateTime) 

Dann in while-Schleife add Monat

WHILE @Cnt <= 12 
BEGIN 
    set @SQL = @SQL + 'select ' + CAST(MONTH(@TempDate) AS VARCHAR(2)) + ' as M, ''' + DateName(m,@TempDate) + ''' as Month ' 
    IF @Cnt <> 12 SET @SQL = @SQL + ' Union All ' 
    SET @TempDate = DateAdd(m, @Cnt, @TempDate) 
    SET @Cnt = @Cnt +1 
END 

EXEC (@SQL) 
0

Sie sind nicht mit @Month innen während der Arbeit, hier ist der Code, den Sie suchen:

DECLARE @M INT = 1 
DECLARE @SQL VARCHAR(MAX) = '' 
DECLARE @Cnt INT = 1 
DECLARE @Month VARCHAR(25) 

WHILE @Cnt <= 12 
    BEGIN 
     SET @Month = (DATENAME(m, '2016-' + CONVERT(VARCHAR(2), @M) + '-01')) 

     SET @SQL = @SQL + 'select ' + CONVERT(VARCHAR(25), @M) + ' as M, ''' + @Month + ''' as Month' 
     IF @Cnt <> 12 
      SET @SQL = @SQL + ' Union All ' 



     SET @Cnt = @Cnt + 1 
     SET @M = @M + 1 
    END 

EXEC (@SQL) 
+0

Danke, Yeah Ich sehe, wo ich falsch gelaufen bin. –