将动态 SQL 重写为存储过程

Rewriting dynamic SQL in to stored procedure

我看到之前在 this post 中有人问过这个问题,并且还查看了 WHEN-THEN 构造,但它确实没有回答一些问题。

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

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
...

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

您的存储过程将有 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 条件下这将是有益的。

由于这些都是可以为 null 的参数,您可以在 where 中使用 coalesce 而不是在括号中使用 OR。我觉得读起来好一点。

WHERE 合并 (@param_1, field_1)

合并(@param_2,field_2)

合并(@param_3,field_3)