首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习动态SQL

学习动态SQL
EN

Stack Overflow用户
提问于 2016-07-10 13:35:31
回答 3查看 136关注 0票数 0

我正在努力学习动态SQL。

我已经建立了一个基本的例子,我被困住了,我不明白为什么@Month变量不会在每个循环中更新。

下面是我所做的例子:

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
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

我希望从1月到12月生成MonthName

为什么月份名称不更新每个循环?快把我逼疯了,我等不及明天上班去问老板。今晚需要睡觉。

非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-10 19:25:55

您使用的是@m,而不是月份的名称:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-07-10 14:06:37

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

代码语言:javascript
复制
DECLARE @SQL varchar(max) = ''
DECLARE @Cnt int = 1
DECLARE @TempDate DateTime = Cast('2016-03-01' As DateTime)

然后在while循环中添加月份

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-07-11 10:41:27

您没有在里面使用@Month,下面是您要查找的代码:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38292462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档