sql - TSQL 存储函数

标签 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. ')' 附近的语法不正确(即最后一个右括号)

在表值函数中可以有这样的条件吗?基本上,我试图实现一个从“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

最佳答案

去掉 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

关于sql - TSQL 存储函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13592574/

相关文章:

sql - Oracle SQL获取商店分店和分店最大销售额的产品类别

sql-server - 按天数确定日期,“从现在起 180 天是什么日期

sql - SQL Server 如何处理非聚集索引中的包含列?

sql-server - 在 SQL Server 2005 中使用 CTE 进行递归查询

sql - MySQL JOIN ON 与 WHERE

sql - 计算重叠时间范围内的分钟数总和

SQL Server SELECT 到 JSON 函数

mysql - 查找不同日期的价格差异

sql - 如何格式化 SQL 表查询?

java - 将sql结果集放入JList