2

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

)

これを実行すると、次の 2 つのエラーが発生します。

  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
4

2 に答える 2

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
于 2012-11-27T20:44:17.627 に答える
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 ステートメントと論理的に同等です。

于 2012-11-27T21:00:38.007 に答える