我想在sql server中创建一个函数,根据其价格前缀返回产品成本。价格前缀为“+”或“ - ”。
我的代码是:
CREATE FUNCTION calculateOptionCost ( @product_price Decimal, @optionPrice Decimal, @action varchar )
RETURNS Decimal
AS
BEGIN
IF (@action == '+')
RETURN (@product_price + @optionPrice);
IF (@action == '-')
RETURN (@product_price - @optionPrice);
END
GO
在参数中,我已经通过了它的母产品价格,价格和价格前缀。但是当我执行此代码时,系统会给出错误:
The last statement included within function must be a return statement.
答案 0 :(得分:1)
您的路径不会返回任何值(如果@action
不是+
或-
)
添加RETURN @product_price
作为最后一行,你会没事的
OR
假设如果param不是+
,则它是-
并使用ELSE
答案 1 :(得分:1)
试试这个:
CREATE FUNCTION calculateOptionCost (@product_price Decimal, @optionPrice Decimal, @action varchar)
RETURNS Decimal
AS
BEGIN
Declare
@Result Decimal
IF (@action == '+')
Begin
Set @Result = (@product_price + @optionPrice);
End
IF (@action == '-')
Begin
Set @Result = (@product_price - @optionPrice);
End
Return @Result
END
GO
答案 2 :(得分:1)
如果您愿意,请使用此功能:
CREATE FUNCTION calculateOptionCost (
@product_price decimal,
@optionPrice decimal,
@action varchar)
RETURNS Decimal
AS
BEGIN
DECLARE @res decimal
IF (@action == '+')
SET @res = @product_price + @optionPrice
ELSE
SET @res = @product_price - @optionPrice
RETURN @res
END
GO
DECLARE @action char(1) = '-'
SELECT price1, price2, calculateOptionCost(price1, price2, @action)
FROM tbl1
但是,如果我是你,我不会使用某个功能。有更好,更优的方法。
我建议你将基于函数的调用的执行时间与这个表达式进行比较,它完全相同:
SELECT price1, price2, calculate.OptionCost
FROM tbl1
CROSS APPLY (
SELECT OptionCost = CASE
WHEN @action = '+' THEN price1 + price2
WHEN @action = '-' THEN price1 - price2
ELSE NULL END
) calculate
但是,我会简化逻辑:如果'+'出现,请考虑积极。否则否定。
SELECT price1, price2, calculate.OptionCost
FROM tbl1
CROSS APPLY (
SELECT OptionCost = CASE
WHEN @action = '+' THEN price1 + price2
ELSE price1 - price2 END
) calculate
答案 3 :(得分:0)
您需要确保该函数返回所有执行路径中的值。
如果if conditions are false
(@action既不是+也不是 - )那么函数会返回什么?
如果不满足这两个条件,则退回产品价格。
CREATE FUNCTION calculateOptionCost ( @product_price Decimal, @optionPrice Decimal, @action varchar)
RETURNS Decimal
AS
BEGIN
IF (@action == '+')
RETURN (@product_price + @optionPrice);
IF (@action == '-')
RETURN (@product_price - @optionPrice);
RETURN @product_price
END
GO