如何在存储过程中实现sql搜索功能(Sql Server 2008)

时间:2010-11-09 20:25:34

标签: sql-server stored-procedures

我需要编写一个存储过程,它将根据可选参数使用sql server 2008搜索表。

将有两种模式

  • 基本搜索模式(我们只传递一些文字)
  • 高级搜索模式(使用可选参数而不使用SearchText。)

    进行测试我正在使用AdventureWorks.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 =@FirstName OR @FirstName IS NULL) 
        AND (LastName =@LastName OR @FirstName IS NULL) 
        AND (EmailAddress =@EmailAddress OR @EmailAddress IS NULL) 
        AND (Phone =@Phone OR @Phone IS NULL) 

    END

2 个答案:

答案 0 :(得分:2)

就个人而言,我将基本搜索和高级搜索拆分为两个单独的程序,并且我会认真考虑为您的基本搜索实施fulltext searching

答案 1 :(得分:1)

我同意乔。您的解决方案将导致参数嗅探。解决param嗅探的一种方法是分成基本和高级搜索存储过程。但即便如此,您仍需要在高级搜索存储过程中使用动态SQL以避免参数嗅探。我不知道你的具体情况,但如果你只有一两个字段可以搜索,那么也许你不需要担心param嗅探,但如果你有,比方说,超过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

的有用文章