将操作数作为sql参数传递

时间:2012-05-22 13:30:13

标签: c# asp.net sql-server-2008

我目前正在开发一个以sql server 2008作为后端的asp.net应用程序。我想让用户能够在SQL语句中指定他们想要过滤的内容。 在界面上,我给他们提供了选择以下作为下拉列表的选项: 等于 比...更棒 少于 等

我想将此作为参数传递给要执行的sql查询。我怎样才能做到最好?

例如;

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

@operand是上述下拉菜单的返回值= < > <= >=

3 个答案:

答案 0 :(得分:7)

假设所有正整数&lt; 20亿,这个解决方案避免了多个查询和动态SQL。 OPTION (RECOMPILE)有助于阻止参数嗅探,但这可能不是必需的,具体取决于表的大小,参数设置和“针对ad hoc工作负载进行优化”设置。

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);

答案 1 :(得分:0)

我会写一些“IF”语句。代码不是很短,但应该很快。

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

另外,我想说,Top(@someRowCount)可能是个好主意。

答案 2 :(得分:-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

阅读注释为什么首选sp_executesql(仍然要注意sql注入!)

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

http://www.sommarskog.se/dynamic_sql.html#queryplans

中令人敬畏的论文中的更多信息