簡體   English   中英

如何處理動態sql參數

[英]How to handle dynamic sql parameters

處理動態sql參數的好方法是什么?

我有一個搜索表單,其中包含一大堆不同的搜索參數。 如果參數為空並且我在sql字符串中有參數,那么它會阻塞或減慢查詢?

根據具體實現,我們有兩種解決此問題的通用方法:

1)在代碼中動態構建SQL查詢的filter語句,跳過任何空的參數。 如果允許用戶為單個列選擇多個值(即選擇50個狀態中的0個或更多個來過濾數據),這是最佳方法。

例如:

假設txtCondition1和txtCondition2是文本框:

        // Assuming conn is an open SqlConnection

        System.Text.StringBuilder sbSQL = new StringBuilder(500);

        List<SqlParameter> cParameters = new List<SqlParameter>();

        // Add a default condition of 1=1 so that all subsequent conditions can be added 
        // with AND instead of having to check to see whether or not any other conditions
        // were added before adding AND.
        sbSQL.Append("SELECT * FROM MyTestTable WHERE 1 = 1 ");

        if (!String.IsNullOrEmpty(txtCondition1.Text)) {
            sbSQL.Append(" AND Column1 = @Column1");
            cParameters.Add(new SqlParameter("@Column1", txtCondition1.Text));
        }
        if (!String.IsNullOrEmpty(txtCondition1.Text))
        {
            sbSQL.Append(" AND Column2 = @Column2");
            cParameters.Add(new SqlParameter("@Column2", txtCondition2.Text));
        }

        SqlCommand oCommand = new SqlCommand(sbSQL.ToString, conn);
        if (cParameters.Count != 0) 
        {
            oCommand.Parameters.AddRange(cParameters.ToArray());
        } 

        // Do something with oCommand

2)如果值受到更多限制,我們通常會將它們傳遞給存儲過程,該過程負責通過測試“空白”參數來確定是否要評估該值,null,空字符串,0表示數字等

可以做的一件事是檢查參數是否已傳遞給存儲過程。 你可以這樣做:

create procedure my_procedure (
  @param1 as int = null
  @param2 as int = null
) as 
begin

   select field1, field2, fieldn
     from table
    where ((@param1 is null) or (field2 = @param1))
      and ((@param2 is null) or (field2 = @param2))
end 

我寧願在sql程序上執行此操作而不是在應用程序中執行此操作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM