2008-11-03 8 views
65

Wie kann ich eine Zeichenfolge in der SQL Server-Prozedur umgehen, so dass es in LIKE Ausdruck sicher verwendet werden kann.Escape eine Zeichenfolge in SQL Server, damit es sicher in LIKE-Ausdruck verwendet werden kann

Angenommen, ich habe eine NVARCHAR Variable wie so:

declare @myString NVARCHAR(100); 

Und ich will es in einem LIKE Ausdruck verwenden:

... WHERE ... LIKE '%' + @myString + '%'; 

Wie entkommen ich die Zeichenfolge (genauer gesagt, Zeichen, sind sinnvoll, LIKE Mustervergleich, zB % oder ?) in T-SQL, so dass es auf diese Weise sicher zu verwenden ist?

Zum Beispiel gegeben:

@myString = 'aa%bb' 

Ich möchte:

WHERE ... LIKE '%' + @somehowEscapedMyString + '%' 

passen 'aa%bb', 'caa%bbc' aber nicht 'aaxbb' oder 'caaxbb'.

+0

Sie haben Ihre Programmiersprache nicht in –

+0

eingegeben. Seine Programmiersprache ist T-SQL. –

Antwort

81

Um Sonderzeichen in einem LIKE-Ausdruck zu vermeiden, setzen Sie ihnen ein Escape-Zeichen voran. Sie können auswählen, welches Escape-Zeichen mit dem Schlüsselwort ESCAPE verwendet werden soll. (MSDN Ref)

Zum Beispiel dies das Symbol% ​​entkommt, mit \ als Escape-Zeichen:

select * from table where myfield like '%15\% off%' ESCAPE '\' 

Wenn Sie nicht wissen, welche Zeichen in der Zeichenfolge sein wird, und Sie wollen nicht behandeln sie als Platzhalter, Sie alle Platzhalter mit einem Escape-Zeichen voranstellen, zB:

set @myString = replace( 
       replace( 
       replace( 
       replace(@myString 
       , '\', '\\') 
       , '%', '\%') 
       , '_', '\_') 
       , '[', '\[') 

(Beachten Sie, dass Sie Ihre Flucht Zeichen entkommen müssen, und stellen Sie sicher, dass die innere replace ist, so dass Sie nicht entkommen die von der anderenhinzugefügtAussagen). Dann können Sie so etwas wie folgt verwenden:

select * from table where myfield like '%' + @myString + '%' ESCAPE '\' 

Denken Sie auch daran, um mehr Platz für Ihre @myString Variable zuweisen, da es mehr mit dem String-Ersatz werden wird.

+0

Derzeit verwende ich Ansatz in http://stackoverflow.com/questions/13861004/escaping-the-escape-character-does-not-work-sql-like-operator erwähnt Sie sehen irgendwelche Mängel mit diesem Code? – Lijo

+2

@ Lijo, das ist in Ordnung. Diese Antwort bewirkt das Entweichen in C#, während die obige Antwort dies in SQL tut, da sie nicht C# -spezifisch ist. In beiden Fällen ist das Ergebnis dasselbe: Es können beliebige Sonderzeichen in der Suchzeichenfolge ausgeblendet und das Schlüsselwort ESCAPE in Ihrer LIKE-Anweisung verwendet werden. – Rory

+0

Ich denke, Sie müssen auch ein einzelnes Zitat (ersetzen Sie es durch zwei einfache Anführungszeichen, nicht mit '\ '). –

5

Sie geben das Escapezeichen an. Dokumentation hier:
http://msdn.microsoft.com/en-us/library/ms179859.aspx

+1

Ich wünschte mir etwas, das bereits now, was in einem LIKE-Ausdruck entkommen muss. –

+0

Die Antwort schlug vor, dass Sie Ihren eigenen Escape-Charakter angeben, damit "sinnvolle" Zeichen nicht mehr sinnvoll sind. – Goran

3

Möchten Sie nach Strings suchen, die ein Escape-Zeichen enthalten? Zum Beispiel wollen Sie dies:

select * from table where myfield like '%10%%'. 

Wo Sie für alle Felder mit 10% suchen? Wenn dies der Fall ist, können Sie die ESCAPE-Klausel verwenden, um ein Escape-Zeichen anzugeben und das Platzhalterzeichen zu entfernen.

select * from table where myfield like '%10!%%' ESCAPE '!' 
+0

Ich habe ein Beispiel hinzugefügt, was ich zu der Frage möchte. –

16

Hatte ein ähnliches Problem (mit NHibernate, so dass das Schlüsselwort ESCAPE sehr schwierig gewesen wäre) und löste es mit den Klammern Zeichen.So würde Ihre Probe

WHERE ... LIKE '%aa[%]bb%' 

werden, wenn Sie nachweisen müssen:

create table test (field nvarchar(100)) 
go 
insert test values ('abcdef%hijklm') 
insert test values ('abcdefghijklm') 
go 
select * from test where field like 'abcdef[%]hijklm' 
go 
+0

Dies ist die beste Antwort. Verlässt sich nicht auf Escape und funktioniert für alle Strings. – John

+0

Ich denke, das ist das Einfachste und dem, was der Fragesteller gesucht hat, am nächsten. Um nicht zu sagen, dass ESCAPE in einigen Fällen nicht so nützlich ist. – bitoolean

12

Anstatt Flucht alle Zeichen in einer Zeichenfolge, die eine besondere Bedeutung in der Muster-Syntax angegeben haben, dass Sie einen führenden Platzhalter verwenden In dem Muster ist es schneller und einfacher zu tun.

SELECT * 
FROM YourTable 
WHERE CHARINDEX(@myString , YourColumn) > 0 

In Fällen, in denen Sie keine führende Wildcard den Ansatz oben verwenden, sollte jedoch vermieden werden, da es keinen Index für YourColumn verwenden kann.

Zudem muss, wenn der optimale Ausführungsplan entsprechend der Anzahl der passenden Reihen variieren die Schätzungen besser sein können, wenn LIKE mit der eckigen Klammer unter Verwendung von Syntax entweichenden wenn zu both CHARINDEX und the ESCAPE keyword verglichen.

+0

Ausgezeichnet! Aber was wäre, wenn es keine führende Wildcard gäbe? – Colin

+1

@Colin - Wenn es keine führende Wildcard gibt und das Ziel darin besteht, ** alle ** Wildcard-Zeichen an anderer Stelle in der Zeichenfolge zu entschlüsseln, können Sie einfach '=' verwenden. Die Antworten auf escaping Sonderzeichen können für eine Abfrage nützlich sein, die nach Werten sucht, die mit einem bestimmten Wert beginnen, obwohl "LIKE" in diesem Fall einen Index verwenden kann, "CHARINDEX" jedoch nicht. –

Verwandte Themen