我有一个while循环,运行着数年的数据。在此期间,我需要加入的某些表中的一个属性已更改其名称。为了解决这个问题,我认为我可以使用case或if语句。但是我无法获取布尔表达式来理解或接受宏变量中的值。
非常简化(例如,周期很短,而while循环中的所有其他代码都起作用),我的代码如下所示:
declare @StartYear smallint = 2010
declare @Year smallint = @StartYear
declare @EndYear smallint = 2013
declare @YearVC varchar(4) = ''
declare @CreateTable varchar(MAX) = ''
while @Year <= @EndYear
begin
set @YearVC = cast(@Year as varchar)
set @CreateTable = '
if ' + @Year + ' < 2011
select t1.*, t2.a, t2.b, t2.c as e /*Variable t2.e change it´s origin name over time.*/
into ResultTable_' + @YearVC + '
from TableOne_' + @YearVC + ' as t1 left join TableTwo_' + @YearVC + ' as t2 on t1.a=t2.a
if ' + @Year + ' >= 2011
select t1.*, t2.a, t2.b, t2.d as e /*Variable t2.e change it´s origin name over time.*/
into ResultTable_' + @YearVC + '
from TableOne_' + @YearVC + ' as t1 left join TableTwo_' + @YearVC + ' as t2 on t1.a=t2.a
'
exec (@CreateTable)
set @Year = @Year + 1
end
我还尝试了一个case语句(所有变量声明,while循环和@CreateTAble语句都是相同的,因此我只在下面编写选择语法):
select t1.*, t2.b,
case
when ' + @Year + ' < 2011 then t2.c
else t2.d
end as e
into ResultTable_' + @YearVC + '
from TableOne_' + @YearVC + ' as t1 left join TableTwo_' + @YearVC + ' as t2 on t1.a=t2.a
这两个示例都给我一个Msg 245错误:
转换varchar值'
时转换失败是否引用了我的布尔表达式?
我已经以几种不同的方式确定了我发送给该表达式的宏变量值不是varchar。当我尝试使用varchar变量时,却收到Msg 207错误:
无效的列名“ d”。
这意味着它无法找到从2011年以后开始有效的属性名称。
我在这里想念什么?如何定义我的“ if”或“ case”语句,以便SQL Server能够理解,对于2011年之前的年份,它应该查找属性 c ;对于2011年之后的年份,则应该查找属性寻找属性 d ?
我使用MS SQL服务器版本14。
答案 0 :(得分:0)
您只需要从字符串中取出IN(实际上是CASE)语句:
declare @StartYear smallint = 2010
declare @Year smallint = @StartYear
declare @EndYear smallint = 2013
declare @YearVC varchar(4) = ''
declare @CreateTable varchar(MAX) = ''
while @Year <= @EndYear
begin
set @YearVC = cast(@Year as varchar)
set @CreateTable =
CASE WHEN @Year < 2011
THEN
'select t1.*, t2.a, t2.b, t2.c as e /*Variable t2.e change it´s origin name over time.*/
into ResultTable_' + @YearVC + '
from TableOne_' + @YearVC + ' as t1 left join TableTwo_' + @YearVC + ' as t2 on t1.a=t2.a ;'
ELSE
'select t1.*, t2.a, t2.b, t2.d as e /*Variable t2.e change it´s origin name over time.*/
into ResultTable_' + @YearVC + '
from TableOne_' + @YearVC + ' as t1 left join TableTwo_' + @YearVC + ' as t2 on t1.a=t2.a ;'
END
EXEC (@CreateTable)
set @Year = @Year + 1
END