TSQL存储函数

时间:2012-11-27 20:35:56

标签: sql sql-server tsql sql-server-2012

我正在尝试在SQL Server 2012中编写一个表值函数,它根据输入参数调用另一个表值函数,这是一个例子

CREATE FUNCTION [dbo].[fnMyLastFilterFunction] 
(   
    @Param1 VARCHAR(64),
    @Param2 VARCHAR(64),
    @Param3 INT,
    @StartDate DATETIME,
    @EndDate DATETIME
)
RETURNS TABLE 
AS
RETURN 
(

    IF (@Param3 = 0)
    BEGIN
        SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4
        FROM fnMyFirstFilterFunction(@Param1,@Param2) t1
        WHERE t1.DateTimeEnd BETWEEN @StartDate AND @EndDate
    END

)

当我执行此操作时,我遇到两个错误:

  1. 关键字“IF”
  2. 附近的语法不正确
  3. ')'附近的语法不正确(即最后一个右括号)
  4. 是否有可能在表值函数中有这样的条件?基本上我正在尝试从“ fnMyFirstFilterFunction ”中的所有数据开始实现过滤系统。所以“fnMyLastFilterFunction”会获取该数据并按@start和@end日期对其进行过滤。我正在使用存储函数来分离过滤器阶段。我的SQL很生疏,所以如果有更好的方法,我会接受这些想法。

    更新:

    SpectralGhost的建议编译得很好,但如果在函数体中我希望逻辑基于@Param3的值调用不同的函数呢?如下:

    IF (@Param3 = 0)
        BEGIN
            SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4
            FROM fnMyFirstFilterFunction(@Param1,@Param2) t1
            WHERE t1.DateTimeEnd BETWEEN @StartDate AND @EndDate
        END
    ELSE IF (@Param3 = 1)
        BEGIN
            SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4
            FROM fnOtherFilterFunction(@Param1,@Param2) t1
            WHERE t1.DateTimeEnd BETWEEN @StartDate AND @EndDate
        END
    

2 个答案:

答案 0 :(得分:7)

摆脱IF并替换此查询。

 SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4
 FROM fnMyFirstFilterFunction(@Param1,@Param2) t1
 WHERE t1.DateTimeEnd BETWEEN @StartDate AND @EndDate
 AND @Param3 = 0

答案 1 :(得分:2)

要进行编辑,请尝试

 SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4
 FROM fnMyFirstFilterFunction(@Param1,@Param2) t1
 WHERE t1.DateTimeEnd BETWEEN @StartDate AND @EndDate
 AND @Param3 = 0
 UNION ALL
 SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4
 FROM fnOtherFilterFunction(@Param1,@Param2) t1
 WHERE t1.DateTimeEnd BETWEEN @StartDate AND @EndDate
 AND @Param3 = 1

由于@Param3永远不会同时为0和1,因此这在逻辑上等同于if语句。