2

我目前正在开发一个以 sql server 2008 作为后端的 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 有 2 种方法: Exec() 和 sp_executesql

阅读为什么首选 sp_executesql 的评论(不过,请注意 sql 注入!)

我还在表前加上了 dbo,以便执行计划可以在不同用户之间缓存

更多信息请参阅http://www.sommarskog.se/dynamic_sql.html#queryplans上的精彩论文

于 2012-05-22T13:32:59.300 回答