Как использовать макропеременные в операторе if или case - PullRequest
0 голосов
/ 27 июня 2018

У меня есть цикл while, который обрабатывает данные за несколько лет. За это время один атрибут в некоторых таблицах, к которым мне нужно присоединиться, изменил свое имя. Чтобы обойти это, я подумал, что мог бы использовать дело или заявление. Но я не могу заставить логическое выражение понять или принять значение в моей макровариабельной переменной.

Очень упрощенный (с очень коротким периодом только для примера, и весь другой код в цикле 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 ниже):

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 года и позже.

Что мне здесь не хватает? Как мне определить мое утверждение «если» или «дело», чтобы SQL-сервер понимал, что в течение лет до 2011 года он должен искать атрибут c , а в течение лет с 2011 года и далее он должен выглядеть для атрибута d ?

Я использую MS SQL-сервер версии 14.

1 Ответ

0 голосов
/ 27 июня 2018

Вам просто нужно взять свой 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
...