0

5つのフィルターをパラメーターとして渡すストアドプロシージャがあるとします。これらのパラメーターは、クエリの各列へのフィルターです。私のクエリには5つのフィールドがあります。フィルタに1つ以上のNULL(または'')値のパラメータがある場合に、クエリが例外/エラーをスローしないようにするための最良の方法は何ですか?

    SELECT 
        [helpings_turkey],
        [helpings_green_beans],
        [scoops_squash],
        [qty_buscuits],
        [pieces_pie]
    FROM
        [thanksgiving_guest]
    WHERE 
        [helpings_turkey] > @helpings_turkey_filter
        AND [helpings_green_beans] > @helpings_green_beans_filter
        AND [scoops_squash] > @scoops_squash_filter
        AND [qty_buscuits] > @qty_buscuits_filter
        AND [pieces_pie] > @pieces_pie_filter
4

3 に答える 3

2

値がnullの場合、エラーは発生しませんが、結果も取得されません。

あなたはこのようなことをすることができます:

[helpings_turkey] > ISNULL(@helpings_turkey_filter, X)

ここで、「X」は最小値よりも小さいことがわかっているものです。

これは小さなデータセットでは機能しますが、[thanksgiving_guest]テーブルにあるインデックスを利用できない可能性があります。

このようなパターンでフィルターを実行する最もパフォーマンスの高い方法は、通常、次のようにnull以外のフィルター条件が発生したときに句を挿入することにより、SQLを動的にアセンブルすることです。

SET @sql = 'SELECT 
        [helpings_turkey],
        [helpings_green_beans],
        [scoops_squash],
        [qty_buscuits],
        [pieces_pie]
    FROM
        [thanksgiving_guest]
    WHERE 1=1';

IF @helpings_turkey_filter IS NOT NULL BEGIN
    SET @sql = @sql + '[helpings_turkey] > @helpings_turkey_filter'
END
...
IF @pieces_pumpkin_pie_filter IS NOT NULL BEGIN
    SET @sql = @sql + '[pieces_pumpkin_pie] > @pieces_pumpkin_pie_filter'
END

exec sp_executesql @sql, N'@helpings_turkey_filter, ..., @pieces_pumpkin_pie_filter', @helpings_turkey_filter, @pieces_pumpkin_pie_filter`

クエリを動的にアセンブルしている場合でも、引き続きクエリのパラメータ化を行うことに注意してください。

于 2012-09-21T15:03:58.300 に答える
1
 SELECT 
        [helpings_turkey],
        [helpings_green_beans],
        [scoops_squash],
        [qty_buscuits],
        [pieces_pie]
    FROM
        [thanksgiving_guest]
    WHERE 
        [helpings_turkey] > IsNull(@helpings_turkey_filter, 0)
        AND [helpings_green_beans] > IsNull(@helpings_green_beans_filter, 0)
        AND [scoops_squash] > IsNull(@scoops_squash_filter, 0)
        AND [qty_buscuits] > IsNull(@qty_buscuits_filter, 0)
        AND [pieces_pumpkin_pie] > IsNull(@pieces_pumpkin_pie_filter, 0)

このようなもの。渡された場合はパラメーターを使用し、デフォルトで値が設定されていない場合は、パラメーターを使用します。デフォルトはゼロです。

于 2012-09-21T14:59:25.927 に答える
1

これで問題が解決するので、これを試してください(NULLになる可能性のある複数のパラメーターを渡す場合:

SELECT 
        [helpings_turkey],
        [helpings_green_beans],
        [scoops_squash],
        [qty_buscuits],
        [pieces_pie]
    FROM
        [thanksgiving_guest]
    WHERE 
        [helpings_turkey] > ISNULL(@helpings_turkey_filter, 0)
        AND [helpings_green_beans] > ISNULL(@helpings_green_beans_filter, 0)
        AND [scoops_squash] > ISNULL(@scoops_squash_filter, 0)
        AND [qty_buscuits] > ISNULL(@qty_buscuits_filter, 0)
        AND [pieces_pumpkin_pie] > ISNULL(@pieces_pumpkin_pie_filter, 0)
于 2012-09-21T15:09:54.607 に答える