Genaue Übereinstimmung mit einer gespeicherten Prozedur mit einem LIKE in T-SQL?

Ich habe eine gespeicherte Prozedur (SP) mit einem LIKE. Lassen Sie uns es vereinfachen: WÄHLEN SIE * VON Kunden WO NIMMER '%' + @query + '%' .

Ich möchte es für eine (optionale) exakte Übereinstimmung verwenden, ohne die gespeicherte Prozedur zu ändern, aber mit einem kniffligen Parameter;)

Gibt es eine Möglichkeit, die 2 '%' mit einem cleveren @ query zu "abbrechen" ?

Sicher, verwenden Sie eine Variable, um die beiden% character zu halten, und legen Sie es auf eine leere characterfolge, wenn Sie eine genaue Übereinstimmung wollen.

Mit der grundlegenden Antwort von Vinko, könnte man haben

 Erstellen der Prozedur Match
     @needle varchar (max), @mode int
 wie
 Start
 deklariere @like char (1);

 set @like = case wenn @like = 1 dann '%' else '' endet

 AUSWÄHLEN * VON Kunden WO NA WIE (@like + @needle + @like)
 Ende

Warum muss es so sein? Etwas wie dieses macht mehr Sinn (ungetestet, hat wahrscheinlich einige Bugs / Tipperrors)

create procedure match @needle varchar(max), @mode int as begin declare @query varchar(max) if @mode = 1 begin set @query = 'SELECT * FROM customers WHERE name LIKE ''%' + @needle + '%''' end else begin set @query = 'SELECT * FROM customers WHERE name = ''' + @needle + ''' end exec @query end 

EDIT: Da du den Prototyp nicht ändern möchtest, kannst du den Modusparameter simulieren oder einfach den String mit dem% s senden

 create procedure match @modeneedle varchar(max) as begin declare @mode varchar(1) declare @needle varchar(max) set @mode=substring(@modeneedle,1,1) set @needle=substring(@modeneedle,2,len(@modeneedle)) declare @query varchar(max) if @mode = '1' begin set @query = 'SELECT * FROM customers WHERE name LIKE ''%' + @needle + '%''' end else begin set @query = 'SELECT * FROM customers WHERE name = ''' + @needle + ''' end exec @query end 

Hinweis: Ich würde es niemals empfehlen. Es ist ein character dafür, dass du es wirklich tust, wirklich falsch Having said that, wenn Sie wirklich wollen, um Ihre eigene SQL-Injektion zu tun, und Ihre gespeicherte Prozedur ist wie folgt:

 set @query = 'SELECT * FROM tmpCustomer WHERE name LIKE ''%' + @needle + '%''' exec (@query) 

Dann laufe deine gespeicherte Prozedur wie folgt:

 exec match '~~~~THIS WILL NEVER BE IN THE DATABASE~~~~'' OR name = ''testing'' OR ''notapercentagesign'' = ''' 

… sollte eine genaue Match-search nach 'testing' machen.

Aber ehrlich gesagt, wenn du so etwas mit deinem eigenen Computersystem machen musst, dann hast du verloren, und hier ist ein paar Beweise: Lass deine gespeicherte Prozedur wie folgt ausführen:

 exec match '''; DELETE FROM Customer; SELECT * FROM Customer WHERE name LIKE '' ' 

… löscht alle Ihre Kundenaufzeichnungen 🙂

Versuchen:

 select * from customers where case @exact then name = @query else name like '%' + @query + '%' end;