在SQL Server中转义string,以便在LIKEexpression式中使用它是安全的

如何在SQL Server的存储过程中转义string,以便在LIKEexpression式中使用它是安全的。

假设我有一个NVARCHARvariables,如下所示:

 declare @myString NVARCHAR(100); 

我想用LIKEexpression式来使用它:

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

如何在T-SQL中转义string(更具体地说,对LIKE模式匹配有意义的字符,例如%? ),以便以这种方式使用是安全的?

例如,给出:

 @myString = 'aa%bb' 

我想要:

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

匹配'aa%bb''caa%bbc'而不是'aaxbb''caaxbb'

要在LIKEexpression式中转义特殊字符,您需要使用转义字符作为前缀。 您可以select使用ESCAPE关键字的转义字符。 ( MSDN参考 )

例如,这个转义%符号,使用\作为转义字符:

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

如果您不知道string中的字符是什么,并且不想将它们当作通配符,则可以将所有通配符与转义字符相加,例如:

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

(注意,你必须逃避你的转义字符,并确保这是内部replace所以你不会逃避从其他replace语句添加的)。 那么你可以使用这样的东西:

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

还要记住给@myStringvariables分配更多的空间,因为它将会随着stringreplace而变长。

有一个类似的问题(使用NHibernate,所以ESCAPE关键字将非常困难),并使用括号字符解决它。 所以你的样品会变成

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

如果你需要certificate:

 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 

而不是转义string中的所有字符,在模式语法中具有特别的意义,因为您在模式中使用了前导通配符,这样做更快更容易。

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

在不使用前导通配符的情况下,应避免上述方法,因为它不能在YourColumn上使用索引。

另外,如果最佳执行计划会根据匹配行的数量而有所不同,那么与CHARINDEXESCAPE关键字相比,使用带有方括号转义语法的LIKE时,估计可能会更好。

您指定转义字符。 文档在这里:
http://msdn.microsoft.com/en-us/library/ms179859.aspx

你想查找包含转义字符的string吗? 比如你想要这个:

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

你想在哪里search10%的所有字段? 如果是这种情况,则可以使用ESCAPE子句来指定转义字符并转义通配符。

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