Wie kann ich eine Zeichenfolge in der gespeicherten Prozedur von SQL Server maskieren, damit sie sicher im LIKE
Ausdruck verwendet werden kann ?
Angenommen, ich habe eine NVARCHAR
Variable wie folgt:
declare @myString NVARCHAR(100);
Und ich möchte es in einem LIKE
Ausdruck verwenden:
... WHERE ... LIKE '%' + @myString + '%';
Wie kann ich die Zeichenfolge (insbesondere Zeichen, die für den LIKE
Mustervergleich von Bedeutung sind, z. B. %
oder ?
) in T-SQL umgehen, damit die Verwendung auf diese Weise sicher ist?
Zum Beispiel gegeben:
@myString = 'aa%bb'
Ich will:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
zu passen 'aa%bb'
, 'caa%bbc'
aber nicht 'aaxbb'
oder 'caaxbb'
.
quelle
\'
).'
für die Zwecke von LIKE nicht entkommen , da es für LIKE kein Sonderzeichen ist. Zum Beispiel funktioniert dies gut:declare @s nvarchar(max); set @s = '%''%'; with a_cte as ( select 'I''m adam' as aColumn ) select * from a_cte where aColumn like @s;
'
zu verwenden, um ein einzelnes Anführungszeichen in einer Zeichenfolgenkonstante zu definieren. Ja, das müssen Sie tun, aber der resultierende Zeichenfolgenwert enthält nur ein einfaches Anführungszeichen: Das Escapezeichen wird nur ausgeführt, um das einfache Anführungszeichen in die Zeichenfolgenvariable zu übernehmen, wenn es als konstanter Wert deklariert wird. Sie könnten das'
irgendwo auswählen und müssten es nicht entkommen.Hatte ein ähnliches Problem (mit NHibernate, daher wäre das Schlüsselwort ESCAPE sehr schwierig gewesen) und löste es mit den Klammerzeichen. So würde Ihre Probe werden
Wenn Sie Beweise benötigen:
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
quelle
Anstatt alle Zeichen in einer Zeichenfolge zu maskieren, die für die Mustersyntax von besonderer Bedeutung sind, da Sie einen führenden Platzhalter im Muster verwenden, ist dies schneller und einfacher.
SELECT * FROM YourTable WHERE CHARINDEX(@myString , YourColumn) > 0
In Fällen, in denen Sie keinen führenden Platzhalter verwenden, sollte der oben beschriebene Ansatz vermieden werden, da kein Index für verwendet werden kann
YourColumn
.In Fällen, in denen der optimale Ausführungsplan je nach Anzahl der übereinstimmenden Zeilen variiert, sind die Schätzungen möglicherweise besser, wenn
LIKE
die Syntax mit eckigen Klammern im Vergleich zu beidenCHARINDEX
und demESCAPE
Schlüsselwort verwendet wird .quelle
=
stattdessen einfach verwenden . Die ausgeblendeten Sonderzeichenantworten können dennoch für eine Abfrage nützlich sein, die nach Werten sucht, die mit einem bestimmten Wert beginnen, daLIKE
in diesem Fall ein Index verwendet werden kann, dies jedochCHARINDEX
nicht kann.Sie geben das Escape-Zeichen an. Dokumentation hier:
http://msdn.microsoft.com/en-us/library/ms179859.aspx
quelle
Möchten Sie nach Zeichenfolgen suchen, die ein Escape-Zeichen enthalten? Zum Beispiel möchten Sie dies:
select * from table where myfield like '%10%%'.
Wo möchten Sie mit 10% nach allen Feldern suchen? In diesem Fall können Sie die ESCAPE-Klausel verwenden, um ein Escape-Zeichen anzugeben und das Platzhalterzeichen zu maskieren.
select * from table where myfield like '%10!%%' ESCAPE '!'
quelle
Alternative Escape-Syntax:
SELECT * FROM tab WHERE col LIKE 'a\_c' {escape '\'};
db <> Geigen-Demo
quelle