这是我的函数,仅返回欧洲价格
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
现在的问题是我的函数应该根据地区返回价格。
我有两个桌子
我的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
答案 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
的更多信息
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