我需要編寫一個搜索查詢(存儲過程),其中輸入參數的數量將大於15.用戶可以傳遞單個參數值或參數組合。搜索查詢動態與靜態 - SQL Server 2012
什麼是最好的辦法
靜態如下方法:
DECLARE @FirstName VARCHAR(50) = 'XYZ' , @LastName VARCHAR(50) = 'ABC' , @MiddleName VARCHAR(50) = '999-9999%''; Select 1 as Abc where 1 like ''%1' SELECT * FROM [Person].[Person] WHERE FirstName LIKE '%' + @FirstName + '%' OR LastName LIKE '%' + @LastName + '%' OR MiddleName LIKE '%' + @MiddleName + '%'
動態SQL方法如下:
DECLARE @FirstName VARCHAR(50) = 'XYZ', @LastName VARCHAR(50) = 'ABC', @MiddleName VARCHAR(50) = '999-9999%' DECLARE @select VARCHAR(5000) = 'Select * from [Person].[Person] ' DECLARE @WhereClause VARCHAR(5000) = 'Where' IF (@FirstName IS NOT NULL OR @FirstName <> '') SET @WhereClause = @WhereClause + ' FirstName Like ''%' + @FirstName + '%''' IF (@LastName IS NOT NULL OR @LastName<> '') IF (@WhereClause <> 'Where') SET @WhereClause = @WhereClause + ' OR LastName Like ''%' + @LastName+ '%''' ELSE SET @WhereClause = @WhereClause + ' LastName Like ''%' + @LastName+ '%''' IF (@MiddleName IS NOT NULL OR @MiddleName <> '') IF (@WhereClause <> 'Where') SET @WhereClause = @WhereClause + ' OR MiddleName Like ''%' + @MiddleName + '%''' ELSE SET @WhereClause = @WhereClause + ' MiddleNameLike ''%' + @MiddleName + '%'''
EXEC(@select + @WhereClause )
的問題吧:
隨着接近1我必須包括WHERE
子句中的每一個參數。我認爲,即使參數的值沒有提供,它仍然會在相關列中搜索,但性能會降低,並且每次都會有所降低。
與方法2我認爲它很可能SQL注入。 實施例: 如果在殼體2中的參數值作爲
DECLARE @FirstName VARCHAR(50) = 'XYZ', @LastName VARCHAR(50) = 'ABC', @MiddleName VARCHAR(50) = '999-9999%''; Select 1 as Abc where 1 like ''%1';
傳遞所得到的SQL查詢將執行將是
Select * from [Person].[Person] Where FirstName Like '%XYZ%' OR LastName Like '%ABC%' OR MiddleName Like '%999-9999%'; Select 1 as Abc where 1 like '%1%'
這是不好的。
那麼什麼是最好的方式來編碼與最佳性能。
避免使用't.column1 = ISNULL(@ param1,t.column1)'如果't.column1'爲'NULL',那麼即使您在't.column2'上找到匹配項,您也會省略那一排。對於這種情況,我認爲將'AND'改爲'OR'可能奏效。 –