如何基于函数中的条件返回值? SQL服务器

时间:2019-07-10 09:07:40

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

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

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技能不是很好。我无法根据地区返回价格?

我尝试过但一直出现此错误

  

函数中包含的最后一个语句必须是return语句。

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

3 个答案:

答案 0 :(得分:1)

该错误实际上说明了一切-必须有一个最终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列- 为什么在地球上 ,此函数是否返回{{1} }结果?!?!?!?我将其更改为更合理的NVARCHAR返回类型。

答案 1 :(得分:0)

一种替代方法是:

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 :(得分:0)

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

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

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

LINK 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