2012-11-27 126 views
2

我想寫一個表值函數,在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 

) 

當我執行此我得到兩個錯誤:

  1. 附近關鍵字的語法不正確「IF」
  2. 附近有語法錯誤)「(即最後一個右括號)

在表值函數中可能存在這樣的條件嗎?基本上我試圖實現一個過濾系統,開始於「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 
+0

您不能在內聯TVF中使用控制流邏輯。如果你想明確地使用'IF',你需要轉換成多語句TVF,但我認爲答案是一個更好的選擇,因爲它們允許函數保持內聯。 –

回答

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 

由於@參數3將永遠都在0和1這同時是邏輯上等同於一個if語句。

+0

謝謝Brian的幫助,我試圖想辦法使用CASE /什麼時候,但你的解決方案是完美的:) – kingrichard2005

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 
+0

正如Brian在他編輯的問題的回答中所說的,只需爲每個@Param值做一個聯合就可以解決問題。 – UnhandledExcepSean

+0

感謝SpectralGhost讓你和Brian爲你提供幫助,爲了啓發我,我在SQL的世界中學到了新的東西:) – kingrichard2005