【发布时间】: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
)
执行此操作时出现两个错误:
- 关键字“IF”附近的语法不正确
- ')' 附近的语法不正确(即最后一个右括号)
表值函数中是否可以有这样的条件?基本上我试图实现一个过滤系统,从“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