Comment puis-je implémenter la fonctionnalité de search sql dans une procédure stockée (Sql Server 2008)

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

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.