将动态SQL重写到存储过程中

时间:2015-01-07 19:34:07

标签: sql sql-server tsql

我发现this post之前已经问过这个问题,并且还查看了WHEN-THEN构造,但它实际上并没有回答一些问题。

目前,在代码中,使用StringBuilder构建SQL查询,如下所示:

buildSearchQuery.Append("SELECT * FROM Policy WHERE Field_1 = '" + param_1 + "'");

if (Condition 2){
    buildSearchQuery.Append("AND Field_2 = '" + param_2 + "' ");
}
if (Condition 2)
{
   buildSearchQuery.Append("AND Field_3 = '" + param_3 + "' ");
}
...

你得到了照片。这些参数值总共有20个,我的任务是创建一个存储过程并将这些值作为参数传递。

我是否创建了包含所有参数的存储过程并在那里执行逻辑,如果是这样,我不确定如何。像这样的东西?

SELECT * FROM TABLE WHERE Field_1 = @param_1
IF(@param_2 <> NULL)
    AND Field_2 = param_2
...

这些参数不会总是有值,因此它们不能成为查询的一部分。什么是使这项工作牢记性能的最佳方法?

2 个答案:

答案 0 :(得分:4)

您的存储过程将有3个参数@ param_1,@ param_2,@ param_3

这些参数的默认值可以设置为NULL。

存储过程中的条件将是这样的

WHERE  ( @param_1 is NULL or field_1 = @param_1)
       AND 
       ( @param_2 is NULL or field_2 = @param_2)
       AND
       ( @param_3 is NULL or field_3 = @param_3)

OPTOIN(RECOMPILE)

每次执行查询时,添加OPTION(RECOMPILE)都会重建执行计划,使用OR条件这将是有益的。

答案 1 :(得分:1)

由于这些都是可以为空的参数,因此可以在where中使用coalesce而不是parens中的OR。我觉得它看起来好一点。

合并的地方(@ param_1,field_1)
      和
       合并(@ param_2,field_2)
       和
       合并(@ param_3,field_3)