在我的项目中,我使用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。因此,我不能在特定月份获得员工的工资。我必须在动态查询中想要这个。任何帮助将不胜感激。
答案 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"
。