我想寫一個表值函數,在SQL Server 2012中,這使得基於輸入參數的另一個表值函數的調用,這裏是一個例子TSQL存儲函數
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很生疏,所以如果有更好的方法做到這一點,我會接受想法。
UPDATE:
SpectralGhost的建議編譯罰款,但如果在函數體我想邏輯調用基於@參數3的值不同的功能?如下所示:
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,但我認爲答案是一個更好的選擇,因爲它們允許函數保持內聯。 –