一部の日付に基づいて真または偽、または0または1を返す関数を記述しようとしています。たとえば、開始日が&で、終了日が "Mar 01 2010" & "2010年3月2日"かどうかを確認したいとします。 2012年1月1日〜12月30日の日付範囲の場合、日付範囲が '2011年1月1日から2011年12月30日'の場合はtrue、そうでない場合はfalseを返します。次のSQL関数を最適化する方法
現在、そして私はそれが最適化されていない感じ、あなたがこれを何度も呼び出しているいくつかの時間を取って
CREATE FUNCTION dbo.tmpfnIsDateInRange (@rangeStart DATETIME,
@rangeEnd DATETIME,
@chkStart DATETIME,
@chkEnd DATETIME)
RETURNS TINYINT
AS
BEGIN
RETURN CASE
WHEN @chkStart BETWEEN @rangeStart AND @rangeEnd
OR @chkEnd BETWEEN @rangeStart AND @rangeEnd
THEN
1
WHEN @chkStart <= @rangeStart AND @chkEnd >= @rangeEnd
THEN
1
ELSE
0
END;
END
スカラー関数を使用しないように具体的には言います。テーブル・ファンクションでこれをすべてラップすると、パフォーマンスが低下することはなく、テーブル/ビューと同様にパラメータを使用してロジックを再利用できます。 – JeffO