将动态 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)
我看到之前在 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)