在动态sql查询中选择varchar值作为列名

时间:2014-11-08 19:33:09

标签: sql sql-server sql-server-2008

在我的项目中,我使用SQL Server 2008作为后端。我在使用动态sql的过程中面临一个问题。请参阅我正在使用的动态sql的示例代码。

      Declare @Sql varchar(Max)     
      set @Sql='Declare @Counter1 int=1; Declare @Counter2 int;
      Declare @PrevMonthAmt decimal(18,2);
      Declare @CurrMonthAmt decimal(18,2);
      Declare @MonthName varchar(100);

      while @Counter1<=(select count(*) from #Tab1)
           begin                               
                set @Counter2 =  (select count(*) from #TabMonths)
                set @MonthName = (select [Month] from #TabMonths where Id=@Start)
                while @Counter2>=1      
                begin
                    select @CurrMonthAmt=@MonthName from #Tab1 where Id=@Counter1
                    select @PrevMonthAmt=@MonthName from #Tab1 where Id=(@Counter1-1)
                    update #Tab1 set @MonthName=(@CurrMonthAmt-@PrevMonthAmt) where Id=@Counter1
                    set @Counter2=@Counter2-1
                end
                set @Counter1= @Counter1+1
            end;
    select *from #Tab1
    ' Exec @Sql 

此处临时表#Tab1包含员工月份工资明细,#TabMonths包含所有月份的列表。 #Tab1&amp; #TabMonths不是静态字段。它将从前端UI自动从用户下拉选择(开始年份和结束年份)生成。如果用户选择的是开始年份:2013&amp;结束年份:2014年,它将在#Tab1&amp; #TabMonth喜欢2013年1月,2013年2月至2014年12月。

我想在#Tab1中更新当前月薪与上个月薪水之间的差异。但@MonthName并不考虑作为列名,但在从@ Tab1中选择时始终将@MonthName视为varchar。因此,我不能在特定月份获得员工的工资。我必须在动态查询中想要这个。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的问题出在这三行代码中。第一行和第二行尝试将varchar分配给十进制变量。第三行是尝试为varchar变量分配十进制值。

select @CurrMonthAmt=@MonthName from #Tab1 where Id=@Counter1
select @PrevMonthAmt=@MonthName from #Tab1 where Id=(@Counter1-1)
update #Tab1 set @MonthName=(@CurrMonthAmt-@PrevMonthAmt) where Id=@Counter1

作为心理练习,让我们在这里用值替换变量。假设#Tab1包含如下数据,其中......表示4月至10月,4月至10月。

Id    MonthName
---------------
1    January
2    February
3    March
...    ...
11    November
12    December

专注于这行代码:

select @CurrMonthAmt=@MonthName from #Tab1 where Id=@Counter1

@Counter1替换2,为@MonthName替换“二月”,因此代码现在如下所示:

select @CurrMonthAmt="February" from #Tab1 where Id=2

您正尝试将@CurrMonthAmt(代表某人薪水的小数)分配给varchar值"February"而不是小数值,例如5000.00。就个人而言,我宁愿获得报酬5000.00而不是"February"