where條件拼接查詢


最近在做一個動態拼接where條件的查詢,大概想到了以下幾種方法:

1、代碼內拼接查詢條件,sql也是寫在代碼內的。

2、代碼內拼接查詢條件,sql寫在存儲過程內,將 where條件作為一個字符串傳入存儲過程。(這種需要在代碼內過濾sql注入的問題)

3、查詢條件的拼接放到存儲過程內,在存儲過程內對查詢條件值進行參數化。

 

第一種:

  不再書寫

 

第二種:

第1步,先拼接where查詢條件

            StringBuilder condition = new StringBuilder();

            if (param.Province > 0)
            {
                condition.AppendFormat(" AND Province={0}", param.Province);
            }
            if (param.City > 0)
            {
                condition.AppendFormat(" AND City={0}", param.City);
            }
            if (param.County > 0)
            {
                condition.AppendFormat(" AND County={0}", param.County);
            }        

 

第2步:

  注意,Condition參數,將拼接的查詢條件作為字符串傳入,

                DynamicParameters parameters = new DynamicParameters();
                parameters.Add("Condition", condition.ToString());

 

第3步:

  接下來看下存儲過程。只看下關鍵的地方,將拼接好的where條件作為一個字符串傳入存儲過程,這種應該還是有sql注入的問題,因為第一步拼接的時候並沒有對參數值進行參數化

SET @sql = 'SELECT @totalCount = COUNT(1)
                      FROM dbo.Base_Class cls
                      WHERE IsValid=1 ' + @condition;

 

 

第三種:

第1步:將所有用到的查詢參數傳給存儲過程

                var parameters = new DynamicParameters();

                parameters.Add("Province", param.Province);
                parameters.Add("City", param.City);
                parameters.Add("County", param.County);

 

第2步:存儲過程內拼接,並參數化(代碼只留了關鍵部分,並不能保證編譯通過)

PROCEDURE [dbo].[p_GetList]@P_Province INT,
    @P_City INT,
    @P_County INT,AS
BEGINDECLARE @Sql NVARCHAR(MAX) ,@SqlCondition NVARCHAR(MAX) ,
        @Parm NVARCHAR(MAX) ,
SET @Sql='';
    SET @SqlCondition='';
    SET @Parm='';
IF(@P_Province>0)
    BEGIN
        SET @SqlCondition += ' AND Province=@P_Province'
    END
    SET @Parm += '@P_Province int,';
     
    IF(@P_City>0)
    BEGIN
        SET @SqlCondition += ' AND City=@P_City'
    END
    SET @Parm += '@P_City int,';
    
    IF(@P_County>0)
    BEGIN
        SET @SqlCondition += ' AND County=@P_County'
    END            
    SET @Parm += '@P_County int,';
       
  --這個參數展示了,怎么拼接like這樣的查詢條件
IF(@P_SchoolName IS NOT NULL) BEGIN SET @SqlCondition += ' AND Name like ''%''+@P_SchoolName+''%''' END SET @Parm += '@P_SchoolName NVARCHAR(100),'; IF (@Parm<>'') BEGIN SET @Parm= SUBSTRING(@Parm,1,len(@Parm)-1) END SET @Sql = 'SELECT COUNT(1) FROM TableName WHERE IsValid=1 ' + @SqlCondition; SET @Sql = ' SELECT * FROM TableName WHERE IsValid=1 ' + @SqlCondition; EXEC sp_executesql @Sql,@Parm,@P_Province = @P_Province, @P_City = @P_City, @P_County = @P_County END

 

  有個地方需要注意,使用 sp_executesql  時, 第二個參數@pram的拼接並不是和 查詢條件同時進行的,查詢條件只有輸入值時才拼接,而@pram 將所有的查詢條件中的參數拼接。如果查詢條件中沒有用到某個參數,但在sp_executesql 的輸入參數中過多的指定參數,也是可以的。這樣就解決了  查詢條件參數個數不固定的情況下,無法解決給 sp_executesql 輸入參數賦值的問題,因為不知道要給多少個參數賦值。

      一開始也是這么做的,但可能因為其他錯誤導致報“過多的指定參數”的錯誤,以為這種方式不可以,最終還是通過了。

 

  第一種的弊端也顯而易見,改一次結構就要修改代碼,第二種可讀性一般但需要解決注入的問題,第三種可讀性較差但好像又找不出毛病。不知道有沒有其他更好的方式解決這種需要拼接sql才能處理不固定查詢條件的方法。

 

 

  寫完了,要去刷牙吃早飯咯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM