Autoriser * dans une requête SQL

J'ai une procédure stockée et je veux autoriser * dedans de sorte que si l'user:

  • types t * puis plus grands, returns de thé
  • types * ou . alors tous les résultats sont returnnés
  • types t alors tous les résultats qui ont t sont returnnés comme ptv, grand, assis

ma procédure stockée est la suivante:

ALTER PROCEDURE [dbo].[SearchEntityDataNew] @SearchText varchar(100) = '*' AS BEGIN SELECT 'Entity' as pagetype,EntityID,EntityData,EntityDataID FROM EntityData WHERE EntityData LIKE '%' + @SearchText+ '%' OR @SearchText = '*' union all SELECT 'Property' as pagetype,PropertyID,PropertyValue,EntityDataID FROM EntityDataProperty WHERE PropertyValue LIKE '%' + @SearchText+ '%' OR @SearchText = '*' END 

Ne pourriez-vous pas utiliser:

 WHERE PropertyValue LIKE REPLACE(@SearchText, '*', '%'); 

Le test suivant:

 -- SAMPLE TABLE DECLARE @T TABLE (A VARCHAR(100)); INSERT @T VALUES ('tea'), ('test'), ('foo'), ('bar'), ('foobar'); -- TEST USING WILDCARD AT END DECLARE @SearchText VARCHAR(100) = 't*'; SELECT * FROM @T WHERE A LIKE REPLACE(@SearchText, '*', '%'); -- TEST USING ONLY WILD CARD SET @SearchText = '*'; SELECT * FROM @T WHERE A LIKE REPLACE(@SearchText, '*', '%'); --TEST USING WILD CARD AT START SET @SearchText = '*bar'; SELECT * FROM @T WHERE A LIKE REPLACE(@SearchText, '*', '%'); --TEST USING WILD CARD AT START AND END SET @SearchText = '*a*'; SELECT * FROM @T WHERE A LIKE REPLACE(@SearchText, '*', '%'); 

Les sorties:

 -- Wild card at end: "t*" tea test -- Wild card only: "*" tea test foo bar foobar -- Wild card at start: "*bar" bar foobar -- wild card at start and end: "*a*" tea bar foobar 

MODIFIER

Je viens de relire votre question, et vu l'exigence que lorsque aucun caractère générique n'est présent pour prendre des caractères generics au début et à la fin, auquel cas vous pouvez append ceci au début de la procédure:

 IF CHARINDEX('*', @SearchText) = 0 SET @SearchText = '%' + @SearchText + '%' ELSE SET @SearchText = REPLACE(@SearchText, '*', '%') 

alors simplement utiliser

 WHERE PropertyValue LIKE @SearchText