创建动态的,用户生成的查询,不限制SQL中的参数

时间:2017-02-22 14:35:38

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

我有一个asp.net页面,允许用户通过生成要包含在存储过程中的where子句来搜索数据库。问题是该程序必须允许不同数量的参数用于不同的条件。过于简化的示例可能类似于:

SELECT [Column1] FROM [TableName] WHERE 1=1
--Everything below user generated
AND
(
   ([Column2] = '1' AND [Column3] = '5' AND [Column4] = '9') OR
   ([Column2] = '2' AND [Column3] = '6' AND [Column4] = '8') OR
   ...
   ([Column2] = '25' AND [Column3] = '3' AND [Column4] = '1')
)
AND [Column5] BETWEEN '10' AND '200'

我想知道最好的解决办法是什么。我知道我可以将where子句构建为字符串并将其作为一个大参数传递给存储过程,并将该批次作为动态sql执行,但是什么是更好的解决方案?

1 个答案:

答案 0 :(得分:0)

首先,存储过程是优化/上下文化的执行计划。

您想要的是对您的操作列,运算符(=,LIKE,<,...)和搜索条件数(AND / OR)没有限制。这不能简化为执行计划。

即使你确实有“轻量级”约束,你也必须在([ColumnX] IS NULL OR [ColumnX] = @parameterX) AND ...之类的搜索条件中使用很多参数。由于参数嗅探(more information here),这将导致性能问题。在优化之后,您仍然不会比从ASP应用程序构造的简单Select更快。

实际上,如果您仍想使用存储过程,则使用动态sql将是最佳解决方案。但是你可能仍会遇到一些你在简单查询中没有的表现(an example of performance problem)。

我在这里回答你的问题是忘记存储过程并使用查询。