2010-11-09 3 views
2

Je dois écrire une procédure stockée qui recherche une table basée sur les paramètres optionnels Utilisation d'un serveur sql 2008.Comment puis-je mettre en œuvre la fonctionnalité de recherche SQL dans une procédure stockée (Sql Server 2008)

Il y aura deux modes

  • mode de recherche de base (nous passons simplement un texte)
  • mode recherche avancée (paramètres facultatifs sont utilisés non SearchText est utilisé.)

    Pour les tests J'utilise le A dventureWorks.Person.Contact table

    Est-ce que vous écrirez quelque chose comme ci-dessous sinon pouvez-vous faire des suggestions pour l'améliorer? Merci beaucoup

    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 

Répondre

1

Je suis d'accord avec Joe. Votre solution entraînerait un reniflage des paramètres. une façon de résoudre le sniff param est de diviser en procédure stockée de recherche de base et avance. Mais même dans ce cas, vous devez utiliser Dynamic SQL dans la procédure stockée de recherche avancée pour éviter le reniflage des paramètres. Je ne connais pas votre situation spécifique, mais si vous avez juste un ou deux champs à rechercher, alors peut-être vous n'avez pas besoin de s'inquiéter de param sniffing, mais si vous avez, disons, plus de 5 ou 6 paramètres, vous devriez y aller avec SQL dynamique. Donc la recherche avancée devrait ressembler à ceci.

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 

Voici un article sur le paramètre sniffer utile http://blogs.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx

+0

@Sadhir: Oui. Dans les commentaires sur [ma réponse] (http://stackoverflow.com/questions/4138227/how-can-i-implement-sql-search-functionality-in-a-stored-procedure-sql-server-2/4138273# 4138273), je viens de pointer le PO sur le blog de Gail Shaw sur [requêtes catch-all] (http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) pour aider Il comprend les problèmes liés à sa technique de recherche avancée. –

+0

Merci pour votre réponse.Bit rouillé sur le côté sql .Couple de questions que fait "où 1 = 1 faire? Aussi je vois que vous construisez une requête comment l'exécutez-vous à la fin? Je dois rechercher par 6 params exactement Merci pour votre aide – user9969

+0

ouais juste vu votre commentaire.Cela ressemble à un blog formidable.Vraiment y jeter un oeil – Sadhir

2

Personnellement, je partagerai la recherche de base et l'avance sur en deux procédures distinctes, et je envisager sérieusement de mettre en œuvre pour fulltext searching votre recherche de base.

+0

Est-sql correcte je veux dire l'utilisation de IsNull et comme opérateur? Ils n'utilisent pas la recherche FullText dans mon bureau. L'édition standard de Sql Server fournit-elle FullText. Si je devais utiliser tel quel, cela pourrait-il être amélioré? – user9969

+1

Votre SQL est syntaxiquement correct. Voir l'article de Gail Shaw sur les [requêtes fourre-tout] (http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) pour comprendre certains problèmes que votre technique de recherche avancée peut rencontrer . La recherche en texte intégral est disponible en édition Standard. Vous aurez besoin de lire dessus pour voir si cela fonctionnera dans votre situation spécifique, mais il devrait fonctionner significativement mieux qu'une recherche 'LIKE '% text%' '. –

Questions connexes