演算子はパラメーター化できません。これはストアド プロシージャであると述べているため、唯一のオプションは 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_executesql
sp_executesql
@p
これがストアド プロシージャでない場合は、C# でクエリ構築手順を実行し、値をパラメーターとして保持することができます。