sql-server - 在 SQL Server 中转义字符串,以便在 LIKE 表达式中安全使用

标签 sql-server tsql stored-procedures sql-like

如何转义 SQL Server 存储过程中的字符串,以便在 LIKE 表达式中安全使用。

假设我有一个 NVARCHAR 变量,如下所示:

declare @myString NVARCHAR(100);

我想在 LIKE 表达式中使用它:

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

如何转义 T 中的字符串(更具体地说,对 LIKE 模式匹配有意义的字符,例如 %?) -SQL,这样使用就安全了吗?

例如,给定:

@myString = 'aa%bb'

我想要:

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

匹配'aa%bb''caa%bbc',但不匹配'aaxbb''caaxbb'.

最佳答案

要转义 LIKE 表达式中的特殊字符,请在它们前面加上转义字符。您可以选择与 ESCAPE 关键字一起使用哪个转义字符。 (MSDN Ref)

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

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

如果您不知道字符串中包含哪些字符,并且不想将它们视为通配符,则可以在所有通配符字符前添加转义字符,例如:

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

(请注意,您也必须转义转义字符,并确保这是内部 replace ,这样您就不会转义从其他 replace 语句添加的内容)。然后你可以使用这样的东西:

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

还要记住为 @myString 变量分配更多空间,因为字符串替换后它会变得更长。

关于sql-server - 在 SQL Server 中转义字符串,以便在 LIKE 表达式中安全使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/258757/

相关文章:

c# - 如何将SQL参数中的字符串数组传递给SQL中的IN子句

sql-server - 如何在 SQL 中从 DateTime 格式获取时间?

sql-server - 在 SQL Server 中基于临时表创建永久表

mysql - MySQL 存储过程中的 EXECUTE 给出语法错误

sql - where 子句中的多列匹配

SQL Server 作业/时间表 - 美国与英国夏令时调整

sql - 如何强制执行 "ALL-TO-ALL"关系?

sql - 条件 where 子句 SQL Server 2012

sql-server-2005 - 使用 CTE 代替 Cursor

mysql - 在 mysql select 中使用存储过程