2016-07-10 50 views
0

我努力学习动态SQL学习的动态SQL

我已经建立了一个基本的例子,我坚持,我不明白为什么每次循环的@Month变量不会更新。

这里是我所做的例子:

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) 

结果:

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 

我期待产生的MONTHNAME从一月到

为什么每月名称不更新每个循环? 让我生气,我不能等到明天上班去问我的老板。今晚需要睡觉。

非常感谢。

+0

看就是生产,包括它在问题中。我很确定,如果你打印出@ @ SQL,这个问题会很明显。 –

+0

这里是输出查询,它对我不是很明显..选择1作为M,'1月'作为月份 联盟全部 选择2作为M,'1月'作为月份 联盟全部 选择3作为M,'1月'as Month Union All 选择4作为M,'1月'作为月份 联盟所有....等等我不知道为什么@Month没有更新 –

回答

0

你提出的@m。但不是该月的名称:

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

谢谢,这很完美。我明白你做了什么。 –

0

您需要每次在循环中添加日期,就像@M变量一样。取日期另一个变量。

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

然后在while循环添加一个月

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

你不与@Month工作内部,同时,这里是你正在寻找的代码:在SQL

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

谢谢,是的,我看到我出错的地方。 –