Как вернуть значение в зависимости от состояния в функции? SQL Server - PullRequest
2 голосов
/ 10 июля 2019

Это моя функция, которая возвращает цену только в Европе

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

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Ошибка действительно говорит сама за себя - должно быть ОДИН окончательный 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).

0 голосов
/ 12 июля 2019

вы хотите вернуть значение на основе условий в SQL Server , тогда вы можете передать output parameter в вашей хранимой процедуре, и это хороший подход.

У меня естьсделал простую демонстрацию для вас для вставки записей в пользовательскую таблицу и возврата сообщений проверки и соответствующих других сообщений на основе условия.

Чтобы получить подробную информацию для output parameter, вы можете посетить эту статью где я подробно объяснил всю информацию, так что вы можете получить больше информации о 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  
0 голосов
/ 10 июля 2019

Альтернативой будет:

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, просто убедитесь, что у каждого стола есть собственная выделенная константа.

...