如何 return 根据函数中的条件判断值? SQL 服务器
How to return value based on if condtion in function? SQL Server
这是我的功能,return 仅限欧洲价格
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
现在的问题是我的功能应该return基于地区的价格。
我有两个表
- [dbo].[tblPricesEurope]
- [dbo].[tblPricesAsia]
我的 SQL 技能不是很好。无法return按地区定价?
我已经尝试过但我一直收到此错误
The last statement included within a function must be a return statement.
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
错误确实说明了一切 - 必须有 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
另外:如果你有一个 numeric PRICE
列 - 为什么 这个函数 return 有 NVARCHAR
结果吗?!?!?!?我把它改成了更合理的 DECIMAL(20,2)
return 类型。
另一种选择是:
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 条件中的常量,它将 return 仅来自所选 table 的结果。
有了这个,您就不必使用 IF 语句了,只需确保每个 table 都有自己的专用常量。
你想 return 值基于 SQL Server 中函数中的 if 条件,那么你可以在你的存储过程中传递 output parameter
,这是一个很好的方法。
我已经为您制作了一个简单的演示,用于在用户中插入记录 table 和 returning 验证消息以及根据条件适当的其他消息。
要获取 output parameter
的详细信息,您可以访问此 article,我在其中详细解释了所有信息,因此您可以对 output parameter
有更多了解
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
这是我的功能,return 仅限欧洲价格
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
现在的问题是我的功能应该return基于地区的价格。
我有两个表
- [dbo].[tblPricesEurope]
- [dbo].[tblPricesAsia]
我的 SQL 技能不是很好。无法return按地区定价?
我已经尝试过但我一直收到此错误
The last statement included within a function must be a return statement.
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
错误确实说明了一切 - 必须有 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
另外:如果你有一个 numeric PRICE
列 - 为什么 这个函数 return 有 NVARCHAR
结果吗?!?!?!?我把它改成了更合理的 DECIMAL(20,2)
return 类型。
另一种选择是:
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 条件中的常量,它将 return 仅来自所选 table 的结果。
有了这个,您就不必使用 IF 语句了,只需确保每个 table 都有自己的专用常量。
你想 return 值基于 SQL Server 中函数中的 if 条件,那么你可以在你的存储过程中传递 output parameter
,这是一个很好的方法。
我已经为您制作了一个简单的演示,用于在用户中插入记录 table 和 returning 验证消息以及根据条件适当的其他消息。
要获取 output parameter
的详细信息,您可以访问此 article,我在其中详细解释了所有信息,因此您可以对 output parameter
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