【问题标题】:TSQL Stored FunctionsTSQL 存储函数
【发布时间】:2012-11-27 20:35:56
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 您不能在内联 TVF 中使用流控制逻辑。如果您想明确使用IF,则需要转换为多语句 TVF,但我认为答案是更好的选择,因为它们允许函数保持内联。

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


【解决方案1】:

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

【讨论】:

  • 正如布赖恩在对已编辑问题的回答中所说,只需为您需要考虑的每个 @Param 值进行联合即可。
  • 感谢 SpectralGhost 和 Brian 的帮助和启发,我在 SQL 的世界中学到了一些新东西 :)
【解决方案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 语句。

【讨论】:

  • 感谢 Brian 的帮助,我试图想办法使用 CASE / WHEN,但您的解决方案非常有意义:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2016-04-04
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多