3

ユーザーが独自のフィルターを作成できる ASP.NET MVC 3 アプリがあります。などのようなものamount > 5 and amount <= 7です。ユーザーは、金額の値と演算子の両方を選択できます。

私の問題は、データを取得するストアド プロシージャにこれらのフィルターを渡す方法です。ストアド プロシージャはすでにかなり複雑です。つまり、null であることが確認される多くのパラメーターが渡されるため、ここで見つけた答えを実際に適用することはできません: T-SQL ストアド プロシージャ - 動的 AND/OR 演算子

これを行う他の方法はありますか?

4

2 に答える 2

4

演算子はパラメーター化できません。これはストアド プロシージャであると述べているため、唯一のオプションは SP 内に T-SQL を記述し、sp_executesql を使用することです。

//TODO : verify (whitelist) that @operator is in a known set of values...
// '=', '<>', '>', '<' etc - otherwise security risk
declare @sql varchar(4000) = 'select * from Foo where Bar '
          + @operator + ' @value'
exec sp_executesql @sql, N'@value int', @value

@sqlこれにより、クエリ ( ) がオンザフライで構築されますが、値 ( @value) はパラメーター化されたままになるため、演算子 ( @operator) のみをホワイトリストに登録する必要があります。

値がパラメータ化された状態を維持する方法を示すために、以下も使用できます。

//TODO : verify (whitelist) that @operator is in a known set of values...
// '=', '<>', '>', '<' etc - otherwise security risk
declare @sql varchar(4000) = 'select * from Foo where Bar '
          + @operator + ' @p'
exec sp_executesql @sql, N'@p int', @value

ここで、@p内部SQL内のパラメーターの名前であり、 はストアド プロシージャ@value内のパラメーターの名前です。3 番目/4 番目/5 番目/etcのパラメーターは、 2 番目のパラメーター toで宣言されたパラメーターにマップされます(この例では、単に宣言されています)。sp_executesqlsp_executesql@p

これがストアド プロシージャでない場合は、C# でクエリ構築手順を実行し、値をパラメーターとして保持することができます。

于 2012-10-02T13:43:13.900 に答える
1

唯一の方法は、sq_executesqlなどの動的SQLを使用することだと思います。これにより、SQL ステートメントを文字列として作成し、実行することができます。しかし、おそらく、既存のストアド プロシージャを大幅に書き換える必要があります。

于 2012-10-02T13:44:21.670 に答える