У меня есть цикл 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.