如何在if或case语句中使用宏变量

时间:2018-06-27 16:34:48

标签: sql if-statement while-loop case

我有一个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。

1 个答案:

答案 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