2015-08-21 67 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 

我的错误信息:

消息156,级别15,状态1,过程FN_USER_MATRIX_PriceTweak,行中的关键字“IF” 21 附近有语法错误。

消息156,级别15,状态1,过程FN_USER_MATRIX_PriceTweak,第22行 关键字 '案' 附近有语法错误。

+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 
)