【问题标题】:How to return value based on if condtion in function? SQL Server如何根据函数中的if条件返回值? SQL 服务器
【发布时间】:2019-07-10 09:07:40
【问题描述】:

这是我的函数,它只返回欧洲的价格

ALTER FUNCTION [prices].[UDF_Fn_IsPriceAvailable]
    (@Product NVARCHAR(100),
     @Region NVARCHAR(100))
RETURNS NVARCHAR(100)
BEGIN
    RETURN 
        (SELECT ISNULL(PRICE, 0) AS PRICE
         FROM [dbo].[tblPricesEurope]
         WHERE product = @Product

END

现在的问题是我的函数应该根据地区返回价格。

我有两张桌子

  • [dbo].[tblPricesEurope]
  • [dbo].[tblPricesAsia]

我的 SQL 技能不太好。我无法根据地区返回价格?

我试过了,但我一直收到这个错误

函数中包含的最后一条语句必须是返回语句。

ALTER FUNCTION [prices].[UDF_Fn_IsPriceAvailable]
    (@Product NVARCHAR(100),
     @Region NVARCHAR(100))
RETURNS NVARCHAR(100)
BEGIN
    IF (@Region = 'Europe')
    BEGIN 
        RETURN 
            (SELECT ISNULL(PRICE, 0) AS PRICE
             FROM [dbo].[tblPricesEurope]
             WHERE product = @Product)
    END
    ELSE IF (@Region = 'Asia') 
    BEGIN 
        RETURN 
            (SELECT ISNULL(India,0) AS PRICE
             FROM [dbo].[tblPricesAsia]
             WHERE product = @Product)
    END
END

【问题讨论】:

  • 为什么一开始就有两张桌子?为什么不只有一个带有 Region 列的?还有为什么你的函数在选择价格后返回NVARCHAR(100)
  • @Sami 两个表的列结构都不同,我想要一个 nvarchar 因为我只是打印值
  • 更好的是让函数返回正确类型的值,让函数的调用者进行转换。这样你的函数会更好地重用
  • 您的PRICE 列是什么数据类型??

标签: sql-server sql-server-2008 sql-server-2012


【解决方案1】:

错误确实说明了一切 - 必须有 ONE 最后的 RETURN 声明 - 所以将您的代码更改为:

ALTER FUNCTION [prices].[UDF_Fn_IsPriceAvailable]
    (@Product NVARCHAR(100),
     @Region NVARCHAR(100))
RETURNS DECIMAL(20,2)
BEGIN
    DECLARE @Result DECIMAL(20,2);

    IF (@Region = N'Europe')
    BEGIN 
        SELECT @Result = ISNULL(PRICE, 0.0) 
        FROM [dbo].[tblPricesEurope]
        WHERE product = @Product
    END
    ELSE IF (@Region = N'Asia') 
    BEGIN 
        SELECT @Result = ISNULL(PRICE, 0.0) 
        FROM [dbo].[tblPricesAsia]
        WHERE product = @Product
    END

    RETURN @result;
END

另外:如果您有 数字 PRICE 列 - 到底为什么这个函数会返回 NVARCHAR 结果吗?! ?!?!?我将其更改为更合理的DECIMAL(20,2) 返回类型。

【讨论】:

    【解决方案2】:

    另一种选择是:

    DECLARE @Result DECIMAL(20,2);
    
    SELECT
      @Result = ISNULL(PRICE, 0.0)
    FROM
    (
      SELECT PRICE
      FROM [dbo].[tblPricesEurope]
      WHERE product = @Product AND @Region = N'Europe'
    
      UNION ALL  
    
      SELECT PRICE
      FROM [dbo].[tblPricesAsia]
      WHERE product = @Product AND @Region = N'Asia'
    ) AS X
    

    由于 where 条件中的常量,它只会返回所选表中的结果。

    有了这个,您不必使用 IF 语句,只需确保每个表都有自己的专用常量。

    【讨论】:

    • 这个解决方案可以工作,但它会执行 2 个查询。所以就性能而言,它可能不是最好的选择
    • 不断比较会排除其中一个子查询,并且由于不可能的 where 条件将速记为 0 条记录。这就像使用 WHERE 1 = 2 查询
    【解决方案3】:

    如果您想根据SQL Server 中函数中的条件返回值,那么您可以在存储过程中传递output parameter,这是一个好方法。

    我为您做了一个简单的演示,用于在用户表中插入记录并根据条件返回验证消息和适当的其他消息。

    要获取output parameter 的详细信息,您可以访问此article,我详细解释了所有信息,因此您可以了解有关output parameter 的更多信息

    链接https://coding-vila.blogspot.com/2018/11/how-to-pass-output-parameter-to-stored-procedure-in-microsoft-sql-server.html

     CREATE PROCEDURE L_UsersIns
        @FirstName VARCHAR(50) ,  
        @LastName VARCHAR(50) ,  
        @Email VARCHAR(50) ,  
        @ReturnValue VARCHAR(50) = '' OUT  
    AS   
        BEGIN  
    
            SET NOCOUNT ON ;  
    
      IF EXISTS (SELECT 1 FROM L_Users WHERE UserName = @UserName) 
      BEGIN
       SET @ReturnValue = @UserName + ' is Already Exists, Please Try Different Username.'  
       RETURN
      END
    
      IF EXISTS (SELECT 1 FROM L_Users WHERE Email = @Email) 
      BEGIN
       SET @ReturnValue = @Email + ' is Already Exists, Please Try Different Email.'  
       RETURN
      END
    
            IF NOT EXISTS ( SELECT 1 FROM L_Users  WHERE   UserName = @UserName AND Email = @Email)   
                BEGIN  
                    INSERT  INTO L_Users  
                            ( 
                              FirstName ,  
                              LastName ,  
                              Email  
                            )  
                    VALUES  ( 
                              @FirstName ,  
                              @LastName ,  
                              @Email   
                            )  
                    SET @ReturnValue = @UserName + ' is Registered Successfully'  
                END  
            ELSE   
                BEGIN  
                    --SET @ReturnValue = 1  
                    SET @ReturnValue = @UserName + ' is Already Exists'  
                END  
        END  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 2023-01-24
      • 2011-12-08
      • 1970-01-01
      • 2023-02-10
      • 2022-12-11
      • 2010-11-07
      • 2019-03-11
      相关资源
      最近更新 更多