Много времени было потрачено на поиск ошибки. Я использовал две другие рабочие функции в качестве руководства при построении этого, но, увы, я до сих пор побежден. Может кто-нибудь сказать мне, почему это возвращает ошибку синтаксиса:Tsql IF ... CASE возвращает ошибку синтаксиса
FUNCTION FN_USER_MATRIX_PriceTweak
(
@Cost float, @CostAvg float,
@Tier1MaxVal float, @Tier1Mult float,
@Tier2MaxVal float, @Tier2Mult float,
@Tier3MaxVal float, @Tier3Mult float,
@Tier4MaxVal float, @Tier4Mult float,
@Tier5MaxVal float, @Tier5Mult float,
@Above5Mult float
)
RETURNS float
AS
BEGIN
DECLARE @Result float
SET @Result =
(
IF @Cost <= @CostAvg
CASE
WHEN @Cost <= @Tier1MaxVal THEN @Cost * @Tier1Mult
WHEN @Cost <= @Tier2MaxVal THEN @Cost * @Tier2Mult
WHEN @Cost <= @Tier3MaxVal THEN @Cost * @Tier3Mult
WHEN @Cost <= @Tier4MaxVal THEN @Cost * @Tier4Mult
WHEN @Cost <= @Tier5MaxVal THEN @Cost * @Tier5Mult
ELSE @Cost * @Above5Mult
ELSE
CASE
WHEN @CostAvg <= @Tier1MaxVal THEN @CostAvg * @Tier1Mult
WHEN @CostAvg <= @Tier2MaxVal THEN @CostAvg * @Tier2Mult
WHEN @CostAvg <= @Tier3MaxVal THEN @CostAvg * @Tier3Mult
WHEN @CostAvg <= @Tier4MaxVal THEN @CostAvg * @Tier4Mult
WHEN @CostAvg <= @Tier5MaxVal THEN @CostAvg * @Tier5Mult
ELSE @CostAvg * @Above5Mult
)
RETURN @Result
END
Мои сообщения об ошибках:
Msg 156, Level 15, State 1, процедура FN_USER_MATRIX_PriceTweak, строка 21 Неправильный синтаксис около ключевого слова 'если' ,
Msg 156, уровень 15, состояние 1, процедура FN_USER_MATRIX_PriceTweak, строка 22 Неверный синтаксис рядом с ключевым словом «CASE».
Вы не с помощью оператора IF правильно. Вместо этого вы должны использовать вложенный оператор CASE. –
. Оказывается, были две проблемы, которые не были полностью объяснены в ответах (или справочных меню): мои операторы CASE нуждались в заявлении END, требование о котором я не знал. –
и, во-вторых, что правая часть SET не может начинаться с оператора IF. –