Table 值函数 - 关键字 'Begin' 附近的语法不正确
Table-valued Functions - Incorrect syntax near the keyword 'Begin'
我正在尝试在 SQL 中编写一个函数,它根据条件执行另一个函数。但我无法修复这里的错误。
fn_GetSpecialLastCurrencyRateByDate, Line - Incorrect syntax near the keyword 'Begin'
CREATE FUNCTION [BCF].[fn_GetSpecialLastCurrencyRateByDate]
(
@SkinId INT,
@CurrencyIdFrom char(3),
@CurrencyIdTo char(3),
@EndDate datetime
)
RETURNS
TABLE
(
Id INT,
CurrencyId char(3),
ToCurrencyId char(3),
Rate decimal(24,18),
Date date
)
AS
Begin
If (not exists( Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc))
BEGIN
return Select Id, CurrencyId,ToCurrencyId ,Rate , Date date from [BCF].fn_GetLastCurrencyRateByDate(@CurrencyIdFrom, @CurrencyIdTo, @EndDate)
END
ELSE
BEGIN
RETURN (
Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc)
END
end
GO
您应该像下面这样声明您的 table 名字
RETURNS @Result
然后你需要插入 @Result
table 代替。
你的整个代码应该是这样的
CREATE FUNCTION [BCF].[fn_GetSpecialLastCurrencyRateByDate]
(
@SkinId INT,
@CurrencyIdFrom char(3),
@CurrencyIdTo char(3),
@EndDate datetime
)
RETURNS @Result
TABLE
(
Id INT,
CurrencyId char(3),
ToCurrencyId char(3),
Rate decimal(24,18),
Date date
)
AS
Begin
If (not exists( Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc))
BEGIN
INSERT INTO @Result
Select Id, CurrencyId,ToCurrencyId ,Rate , Date date from [BCF].fn_GetLastCurrencyRateByDate(@CurrencyIdFrom, @CurrencyIdTo, @EndDate)
END
ELSE
BEGIN
INSERT INTO @Result
Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc
END
RETURN;
end
GO
我正在尝试在 SQL 中编写一个函数,它根据条件执行另一个函数。但我无法修复这里的错误。
fn_GetSpecialLastCurrencyRateByDate, Line - Incorrect syntax near the keyword 'Begin'
CREATE FUNCTION [BCF].[fn_GetSpecialLastCurrencyRateByDate]
(
@SkinId INT,
@CurrencyIdFrom char(3),
@CurrencyIdTo char(3),
@EndDate datetime
)
RETURNS
TABLE
(
Id INT,
CurrencyId char(3),
ToCurrencyId char(3),
Rate decimal(24,18),
Date date
)
AS
Begin
If (not exists( Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc))
BEGIN
return Select Id, CurrencyId,ToCurrencyId ,Rate , Date date from [BCF].fn_GetLastCurrencyRateByDate(@CurrencyIdFrom, @CurrencyIdTo, @EndDate)
END
ELSE
BEGIN
RETURN (
Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc)
END
end
GO
您应该像下面这样声明您的 table 名字
RETURNS @Result
然后你需要插入 @Result
table 代替。
你的整个代码应该是这样的
CREATE FUNCTION [BCF].[fn_GetSpecialLastCurrencyRateByDate]
(
@SkinId INT,
@CurrencyIdFrom char(3),
@CurrencyIdTo char(3),
@EndDate datetime
)
RETURNS @Result
TABLE
(
Id INT,
CurrencyId char(3),
ToCurrencyId char(3),
Rate decimal(24,18),
Date date
)
AS
Begin
If (not exists( Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc))
BEGIN
INSERT INTO @Result
Select Id, CurrencyId,ToCurrencyId ,Rate , Date date from [BCF].fn_GetLastCurrencyRateByDate(@CurrencyIdFrom, @CurrencyIdTo, @EndDate)
END
ELSE
BEGIN
INSERT INTO @Result
Select TOP 1 Id, CurrencyId,ToCurrencyId ,Rate , Date date
From BCF.SkinCurrencyRate
Where SkinId = @SkinId and CurrencyId = @CurrencyIdFrom AND ToCurrencyId = ISNULL(@CurrencyIdTo, 'EUR') and Date<=@EndDate
Order By Date desc
END
RETURN;
end
GO