Procédure stockée multicritère meilleure pratique / model

La procédure stockée suivante fonctionne, mais je me request: existe-t-il une meilleure pratique / model pour traiter ce type d'action dans SQL Server? En substance, je passe dans deux parameters différents. Sur la base de ce qui est passé pour le paramètre "critères", j'exécute une requête avec des conditions spécifiques dans la clause where – Merci.

ALTER PROCEDURE [dbo].[Select_Project_Info_By_Value] ( @value VarChar(50), @criteria VarChar(50) ) AS BEGIN SET NOCOUNT ON; if @criteria= 'All' SELECT some some tables... FROM dbo.Table1 WHERE (NOT (Status = 'ABC')) else if @criteria = 'X' SELECT some some tables... FROM dbo.Table1 WHERE (Matno LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) else if @criteria = 'Y' SELECT some some tables... FROM dbo.Table1 WHERE (ID LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) else if @criteria = 'Z' SELECT some some tables... FROM dbo.Table1 WHERE (ProDescr LIKE '%' + @value + '%') else if @criteria = 'A' SELECT some some tables... FROM dbo.Table1 WHERE (CustCode LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) else if @criteria = 'B' SELECT some some tables... FROM dbo.Table1 WHERE (ApplName LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) END 

Peut-être quelque chose comme ça:

 SELECT some some tables... FROM dbo.Table1 WHERE ( @criteria= 'All' AND (NOT (Status = 'ABC')) ) OR ( @criteria = 'X' AND (Matno LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) ) OR ( @criteria = 'Y' AND (ID LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) ) OR ( @criteria = 'Z' AND (ProDescr LIKE '%' + @value + '%') ) OR ( @criteria = 'A' AND (CustCode LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) ) OR ( @criteria = 'B' AND (ApplName LIKE '%' + @value + '%') AND (NOT (Status = 'ABC')) ) 

Le travail définitif des parameters optionnels dans where clauses et les conditions de search dynamics a été écrit par Erland Sommarskog. Cet article détaille les avantages et les inconvénients de chaque approche (dont il existe de nombreux) Ce lien est pour SQL 2005 et les versions antérieures. Pour 2008, utilisez ce lien (http://www.sommarskog.se/dyn-search-2008.html)

Si j'étais vous, je passerais en revue l'article et choisirais une approche bien que votre question ne puisse pas vraiment être optimisée n'importe comment vous l'écrivez. Vos requêtes LIKE '%' + @value + '%' ne peuvent pas utiliser un index et vous effectuerez toujours des parsings de table.

Dans ce genre de situation, vous pouvez rencontrer des problèmes de reniflage de parameters, car différents parameters d'input peuvent générer des plans de requête ou des paths très différents dans le code. Ce proc peut être un bon candidat pour l'option WITH RECOMPILE .