【问题标题】:How to create function to calculate cost of product according to price prefix(+, -)如何创建根据价格前缀(+,-)计算产品成本的函数
【发布时间】:2013-08-13 20:55:18
【问题描述】:

我想在 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.

【问题讨论】:

    标签: sql-server function


    【解决方案1】:

    您的路径不返回任何值(如果 @action 不是 +-

    添加RETURN @product_price作为最后一行,你会没事的

    假设如果参数不是 + 它是 - 并使用 ELSE

    【讨论】:

    • @OzrenTkalcecKrznaric - 我只是在解释错误。个人认为 SQL 函数不是一个好主意
    【解决方案2】:

    您需要确保函数从所有执行路径返回值。

    如果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 
    

    【讨论】:

    • 感谢您的回复!
    • 当我在查询中调用此函数时,例如“选择 TOP 100 opt.id, opt.option_name_id, opt.suffix, opt.stock, opt.cost, opt.price_prefix 作为前缀, opt.price as option_price, size.size_name, pro.sku, pro.product_name, pro.price as product_price, dbo.calculateOptionCost(product_price, option_price, prefix) as total_cost from ProductOptions as opt LEFT JOIN SizeOptions as size on size.id = opt.option_name_id INNER JOIN Products as pro on pro.product_id = opt.product_id" 然后这个查询给我错误。它说:找不到列“dbo”或用户定义的函数。请给我方法来执行它
    • @user2393886,似乎你必须改变你的表来适应这个功能。不确定这是否与您的情况相关,但这是我在谷歌搜索时得到的。 stackoverflow.com/a/2769023/1654121blogs.msdn.com/b/sqlcat/archive/2011/11/28/…benthurecht.blogspot.in/2011/07/…aldiriz.blogspot.in/2008/10/…。希望这会有所帮助!
    • 您也可以使用@OzrenTkalcecKrznaric 在他之前的回答中提到的CROSS APPLY 进行评估。
    【解决方案3】:

    试试这个:

    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
    

    【讨论】:

      【解决方案4】:

      如果您愿意,请使用此功能:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 2019-02-12
        • 2018-01-19
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        相关资源
        最近更新 更多