2010-11-09 83 views
2

需要編寫一個存儲過程,將搜索基於可選參數表使用SQL Server 2008我如何在存儲過程中實施SQL搜索功能(SQL Server 2008中)

將有兩種模式

  • 基本的搜索模式(我們只是通過一些文本)
  • 高級搜索模式(可選參數用於不SEARCHTEXT使用。)

    爲了測試我使用A dventureWorks.Person.Contact表

    你會寫下類似如下如果不是你可以提出建議如何改善它? 非常感謝

    ALTER PROCEDURE SearchPeople 
    @SearchText nvarchar(200)=NULL, --- only used in basic search mode 
    @SearchMode bit, 
    @FirstName varchar(50)=NULL, 
    @LastName varchar(50)=NULL, 
    @EmailAddress varchar(50)=NULL, 
    @Phone nvarchar(25)=NULL 
    

AS

IF @SearchMode=0 
    BEGIN 
    print 'BASIC SEARCH' 
     SELECT * 
     FROM [Person].[Contact] 
     WHERE (FirstName LIKE '%' + @SearchText + '%' 
     OR LastName LIKE '%' + @SearchText + '%' 
     OR EmailAddress LIKE '%' + @SearchText + '%' 
     OR Phone LIKE '%' + @SearchText + '%') 

    END 

ELSE 
    BEGIN  

    print 'ADVANCED SEARCH' 

     SELECT * 
     FROM [Person].[Contact] 
     WHERE (FirstName [email protected] OR @FirstName IS NULL) 
     AND (LastName [email protected] OR @FirstName IS NULL) 
     AND (EmailAddress [email protected] OR @EmailAddress IS NULL) 
     AND (Phone [email protected] OR @Phone IS NULL) 

    END 

回答

1

我同意喬。您的解決方案將導致參數嗅探。解決參數嗅探的一種方式是分解爲基本和高級搜索存儲過程。但即使如此,您仍然需要在高級搜索存儲過程中使用動態SQL,以避免參數嗅探。我不知道你的具體情況,但是如果你只有一個或兩個字段進行搜索,那麼也許你不需要擔心參數嗅探,但是如果你有,可以說超過5或6個參數,你一定要去與動態SQL。

所以高級搜索應該看起來像這樣。

DECLARE @query VARCHAR(MAX); 

SET @query = 'SELECT * 
       FROM [Person].[Contact] 
       WHERE 1=1 ' 

IF @FirstName IS NOT NULL 
SET @query = @query + ' AND FirstName = @FirstName ' 

IF @LastName IS NOT NULL 
SET @query = @query + ' AND LastName = @LastName ' 

IF @EmailAddress IS NOT NULL 
SET @query = @query + ' AND EmailAddress = @EmailAddress ' 

IF @Phone IS NOT NULL 
SET @query = @query + ' AND Phone = @Phone ' 

sp_executesql @query, 
       N'@FirstName VARCHAR(50), 
       @LastName VARCHAR(50), 
       @EmailAddress VARHCAR(50), 
       @Phone NVARCHAR(25)', 
       @FirstName, 
       @LastName, 
       @EmailAddress, 
       @Phone 

下面是參數嗅探http://blogs.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx

+0

@Sadhir:是的。在評論[我的答案](http://stackoverflow.com/questions/4138227/how-can-i-implement-sql-search-functionality-in-a-stored-procedure-sql-server-2/4138273# 4138273),我只是將OP指向Gail Shaw關於[catch-all queries]的博客文章(http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/)以幫助他了解他的高級搜索技術的問題。 – 2010-11-09 20:56:02

+0

感謝您的答覆。在sql一邊生鏽。偶爾的問題什麼是「哪裏1 = 1做?我也看到你正在建立一個查詢如何執行它在最後?我需要搜索的6個參數準確感謝您的幫助 – user9969 2010-11-09 20:58:17

+0

是的,剛剛看到您的評論,這看起來像一個偉大的博客文章,肯定會檢查出來 – Sadhir 2010-11-09 20:59:10

2

個人而言,我的基礎,推動搜索拆分爲兩個獨立的程序,我會爲實現fulltext searching認真考慮你的基本搜索。

+0

是sql正確我的意思是使用ISNULL和Like運算符的一個有用的文章?他們不在我的辦公室中使用FullText搜索。Sql Server標準版提供FullText。如果我按照原樣使用它,可以改進 – user9969 2010-11-09 20:46:52

+1

你的SQL在語法上看起來是正確的。請參閱Gail Shaw關於[catch-all queries]的博文(http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/),以瞭解您的高級搜索技術可能遇到的一些問題。標準版提供全文檢索功能。你需要閱讀它,看看它是否會在你的特定情況下工作,但它應該比'LIKE'%text%''搜索更好地執行。 – 2010-11-09 20:53:07

相關問題