在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'

5 Solutions collect form web for “在SQL Server中转义string,以便在LIKEexpression式中使用它是安全的”

要在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 '!' 
  • SQL:WHERE子句中的IF子句
  • 哪个SQL查询更快? 过滤连接标准或Where子句?
  • 什么是T-SQL在SQL Server中授予对数据库中表的读写权限?
  • T-SQL子string - 最后3个字符
  • 在SQL Server中隐含1或0的常数
  • 无法在sql server中删除和创build数据库
  • 使用基于Count的IF ELSE语句来执行不同的Insert语句
  • T-SQL语句中前缀N的含义是什么?
  • 为什么RAISERROR拼写错误? 或者不是?
  • 将列添加到表中,然后在事务内部更新它
  • SQL Server:将行转换为列