2011-07-16 24 views
0

我使用帶有高級服務的SQL Server 2008 Express。我有一個看法:具有多個選項的搜索數據庫

IF EXISTS (select * from sys.views where object_id = object_id(N'[dbo].[vw_PersonDetails]')) 
    DROP VIEW vw_PersonDetails 
GO 

CREATE VIEW vw_PersonDetails 
AS 
    SELECT 
     p.PersonID, p.Title, 
     p.FirstName, p.LastName, 
     a.AddressLine1, a.AddressLine2, a.AddressLine3, a.AddressLine4, 
     a.Country, a.PostalCode, 
     a.PhoneNumber, a.Email, p.EntryDate 
    FROM 
     [dbo].[Persons] p 
    INNER JOIN 
     [dbo].[Address] a ON p.PersonID = a.PersonID 
GO 

現在我必須搜索這個視圖與每個列作爲選項。

例:

IF (@firstName != NULL OR @firstName != '') AND 
    (@lastName != NULL OR @lastName != '') AND 
    (@addressLine1 != NULL OR @addressLine1 != '') AND 
    (@postalCode != NULL OR @postalCode != '') AND 
    (@country != NULL OR @country != '') AND 
    (@phoneNumber != NULL OR @phoneNumber != '') AND 
    (@email != NULL OR @email != '') AND 
    (@entryDate != NULL) 
BEGIN 
    SELECT * 
    FROM dbo.vw_PersonDetails 
    WHERE 
     (FirstName LIKE [dbo].[GetSearchString](@firstName) OR 
     LastName LIKE [dbo].[GetSearchString](@lastName) OR 
     AddressLine1 LIKE [dbo].[GetSearchString](@addressLine1) OR 
     Country LIKE [dbo].[GetSearchString](@country) OR 
     PostalCode LIKE [dbo].[GetSearchString](@postalCode) OR 
     PhoneNumber LIKE [dbo].[GetSearchString](@phoneNumber) OR 
     Email LIKE [dbo].[GetSearchString](@email) OR 
     EntryDate = @entryDate 
     ) 
END 

現在有沒有除了寫一個永不落幕的IF-ELSE-IF線索在存儲過程或建築物查詢動態任何其他選項。請幫忙。

另一個問題是,什麼會更好:編寫這樣的存儲過程或從代碼進行動態查詢。

在此先感謝。

回答

1

您可以在一個簡單的查詢做SQL Server足夠智能,以預期的方式將評估短路。但是,這實際上並未得到規範的保證。

如果你想成爲安全起見,你可以這樣做強制評估順序:

SELECT * from dbo.vw_personDetails WHERE (
    (CASE 
     WHEN @firstname IS NULL THEN 1 
     WHEN @firstname='' THEN 1 
     WHEN FirstName like @firstName THEN 1 
     ELSE 0 
    END=1) AND 
    .... (same thing for other parameters) 
1

您需要爲您的查詢填充所有SearchString才能運行(因爲IF語句中的AND條件)。

您可以創建一個動態查詢運行沒有問題,如果參數是通過與否:

SELECT * from dbo.vw_PersonDetails WHERE (
    (@firstName IS NULL OR @firstName = '' OR FirstName like @firstName) AND 
    ... (same thing for other parameters) 

這將由於工作:

DECLARE @sqlCommand VARCHAR(MAX) 
SELECT @sqlCommand = 'SELECT * FROM dbo.vw_PersonDetails WHERE 1=1' 

IF (@firstName != NULL OR @firstName != '') SELECT @sqlCommand = @sqlCommand + ' AND FirstName LIKE [dbo].[GetSearchString](@firstName)' 
IF (@lastName != NULL OR @lastName != '') SELECT @sqlCommand = @sqlCommand + ' AND LastName LIKE [dbo].[GetSearchString](@lastName)' 
IF (@addressLine1 != NULL OR @addressLine1 != '') SELECT @sqlCommand = @sqlCommand + ' AND AddressLine1 LIKE [dbo].[GetSearchString](@addressLine1)' 

..... 

EXEC (@sqlCommand) 
+0

非常棘手和直觀的解決方案。謝謝@Parkyprg。 –