繁体   English   中英

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

[英]Rewriting dynamic SQL in to stored procedure

我看到,这已经问过这个帖子 ,并又看了看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
...

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

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

由于这些都是可空参数,因此可以在where中使用合并,而不是在括号内使用OR。 我认为它的阅读效果更好。

在哪里合并(@ param_1,field_1)

合并(@ param_2,field_2)

合并(@ param_3,field_3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM