2

私は現在、バックエンドとしてSQLServer2008を備えたasp.netアプリケーションに取り組んでいます。SQLステートメントでフィルタリングする対象をユーザーが指定できるようにします。インターフェイスで、ドロップダウンとして次を選択するオプションを提供しています。

これを実行するSQLクエリのパラメータとして渡したい。どうすればこれを達成できますか?

たとえば;

Select amount, deduction, month from loan where amount @operant 10000;

これ@operandは、上記のドロップダウンの戻り値です。= < > <= >=

4

3 に答える 3

7

すべての正の整数が20億未満であると仮定すると、このソリューションは複数のクエリと動的SQLを回避します。OPTION (RECOMPILE)パラメータスニッフィングを阻止するのに役立ちますが、テーブルのサイズ、パラメータ化設定、および「アドホックワークロード用に最適化」設定によっては、これは必要ない場合があります。

WHERE [Amount] BETWEEN 
CASE WHEN @operand LIKE '<%' THEN 0
     WHEN @operand = '>' THEN @operant + 1
     ELSE @operant END
AND
CASE WHEN @operand LIKE '>%' THEN 2147483647
     WHEN @operand = '<' THEN @operant - 1
     ELSE @operant END
OPTION (RECOMPILE);
于 2012-05-22T14:08:45.430 に答える
0

私はいくつかの「IF」ステートメントを書きます。コードはそれほど短くはありませんが、高速である必要があります。

IF(@operand = '=')
Select..
ELSE IF(@operand = '>=')
Select..
...

また、Top(@someRowCount)は素晴らしいアイデアかもしれません。

于 2012-05-22T13:41:25.837 に答える
-1

このシナリオには動的SQLが必要です

あなたの例では、これは次のようになります

DECLARE @sql AS nvarchar(max) -- Use max if you can, if you set 
  -- this to a specific size then your assignment later can be 
  -- truncated when maintained and still be valid.

SET @sql = 'Select amount, deduction, month from dbo.loan where amount ' 
  + @operand + ' 10000'

EXEC sp_executesql @sql

アップデート1

動的SQLを実行するには、Exec()とsp_executesqlの2つの方法があります。

sp_executesqlが好まれる理由のコメントを読んでください(それでも、SQLインジェクションに注意してください!)

また、テーブルの前にdboを付けて、実行プランを異なるユーザー間でキャッシュできるようにします。

詳細については、http://www.sommarskog.se/dynamic_sql.html#queryplansのすばらしい論文をご覧ください。

于 2012-05-22T13:32:59.300 に答える