2014-03-04 53 views
4

我必須在sql 2008中編寫一個搜索查詢,它可以使用多個可選
parameters..ie。帶有多個可選搜索參數的sql搜索查詢

Date From: ... 
Date To: ... 
UserType: ... 
Customer: ... 
User:  ... 

A user can select any of the above search parameters. 
I am planning to use either the separate select statements for different cases, or 
to use coalesce etc. 
Please suggest what would be best possible way out. 

感謝,

+0

可能重複[我怎樣才能用在T-SQL存儲過程的可選參數?](HTTP:/ /stackoverflow.com/questions/3415582/how-can-i-use-optional-parameters-in-at-sql-stored-procedure) –

回答

2

您可以使用動態查詢

SELECT @sql= 
'SELECT DISTINCT [Test_Id], [Test].[Test_Name], [Test].[Test_Date] 
    FROM [Test] 
    WHERE (1 = 1)' 

IF @start IS NOT NULL 
    SELECT @sql = @sql + ' AND ([Test].[Test_Date] >= @start)' 
IF @end IS NOT NULL 
    SELECT @sql = @sql + ' AND ([Test].[Test_Date] <= @end)' 

SELECT @paramlist = '@start datetime, 
    @end datetime' 

EXEC sp_executesql @sql, @paramlist, 
    @start, 
    @end 

您還可以使用不同的查詢,但如果你有2組以上的參數是非常惱人的代碼

IF(@start IS NULL) 
    IF(@end IS NULL) 
     SELECT ... 
    ELSE 
     SELECT ... 
ELSE 
    IF(@end IS NULL) 
     SELECT ... 
    ELSE 
     SELECT ... 
+0

感謝您的及時建議..實際上您的主要選擇語句只使用一個表即'測試',但在我的情況下,我必須使用連接等從4-5個不同的表中選擇值。所以我認爲動態SQL可能有點乏味:)。無論如何,我正在嘗試它..謝謝 – vicky

+0

爲什麼你不能使用JOIN與動態查詢:'從測試JOIN ...' – meziantou

15

您可以通過使用此方法避免使用多個IF ELSE條件和動態查詢。

SELECT * FROM TBL 
WHERE (@Name IS NULL OR Name = @Name) 
AND (@Age IS NULL OR Age = @Age) 
+0

你先生是一個天才的天才。 – Danrex

5

你可以寫你的WHERE子句這樣的事情.....

SELECT ...... 
FROM TABLE 
WHERE 
    (@UserType IS NULL OR UserType = @UserType) 
AND 
    (@Customer IS NULL OR Customer = @Customer) 
AND 
    (@User IS NULL OR User = @User) 
AND 
    (<Similarly Other Conditions>)