簡體   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