0

我有一个运行了几年数据的 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。

4

1 回答 1

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
于 2018-06-27T17:20:39.943 回答