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