J'ai besoin d'écrire une procédure stockée qui va chercher une table basée sur des parameters optionnels Using sql server 2008.
Il y aura deux modes
mode de search avancée (les parameters optionnels sont utilisés et non pas SearchText est utilisé.)
Pour tester, j'utilise la table AdventureWorks.Person.Contact
Souhaitez-vous écrire quelque chose comme ci – dessous si vous ne pouvez pas 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
COMME
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
Je suis d'accord avec Joe. Votre solution entraînerait un reniflage des parameters. une façon de résoudre le sniff param est de split en procédure stockée de search de base et avance. Mais même dans ce cas, vous devez utiliser Dynamic SQL dans la procédure stockée de search avancée pour éviter le reniflage des parameters. Je ne connais pas votre situation spécifique, mais si vous avez juste un ou deux champs à searchr, 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 parameters, vous devriez y aller avec SQL dynamic.
donc la search 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 utile sur le reniflage des parameters http://blogs.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx
Personnellement, je splitais la search de base et la search avancée en deux procédures distinctes, et j'étudierais sérieusement la mise en œuvre de la search en text intégral pour votre search de base.