2015-08-21 4 views
0

Много времени было потрачено на поиск ошибки. Я использовал две другие рабочие функции в качестве руководства при построении этого, но, увы, я до сих пор побежден. Может кто-нибудь сказать мне, почему это возвращает ошибку синтаксиса: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».

+0

Вы не с помощью оператора IF правильно. Вместо этого вы должны использовать вложенный оператор CASE. –

+0

. Оказывается, были две проблемы, которые не были полностью объяснены в ответах (или справочных меню): мои операторы CASE нуждались в заявлении END, требование о котором я не знал. –

+0

и, во-вторых, что правая часть SET не может начинаться с оператора IF. –

ответ

1

Пожалуйста, попробуйте следующее:

IF @Cost <= @CostAvg 
BEGIN 
    SET @Result = 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 
    END 
END 
ELSE 
BEGIN 
    SET @Result = 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 
    END 
END 

RETURN @Result 
1

Вы должны использовать вложенную CASE, где у вас есть ваш IF...ELSE:

SET @Result = 
(
CASE WHEN @Cost <= @CostAvg THEN (
    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 END) 
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 END) 
END 
)