83

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

假设我有一个NVARCHAR像这样的变量:

declare @myString NVARCHAR(100);

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

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

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

例如,给定:

@myString = 'aa%bb'

我想:

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

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

4

6 回答 6

101

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

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

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 变量分配更多空间,因为它会随着字符串替换而变得更长。

于 2008-11-03T15:13:30.130 回答
19

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

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

如果您需要证明:

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
于 2009-07-24T15:24:06.293 回答
15

鉴于您在模式中使用前导通配符,而不是转义字符串中在模式语法中具有特殊意义的所有字符,这样做更快更容易。

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

如果您不使用前导通配符,则应避免使用上述方法,因为它不能在YourColumn.

此外,在最佳执行计划将根据匹配行数变化的情况下,与 和关键字相比LIKE,使用方括号转义语法时估计可能会更好。CHARINDEXESCAPE

于 2012-02-11T16:56:44.283 回答
4

您指定转义字符。此处的文档:http:
//msdn.microsoft.com/en-us/library/ms179859.aspx

于 2008-11-03T14:26:39.990 回答
3

是否要查找包含转义字符的字符串?例如你想要这个:

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

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

select * from table where myfield like '%10!%%' ESCAPE '!'
于 2008-11-03T14:35:39.347 回答
0

替代转义语法:

LIKE 通配符文字

JDBC 驱动程序支持使用 LIKE 子句通配符作为文字的{escape 'escape character'}语法。

SELECT *
FROM tab
WHERE col LIKE 'a\_c' {escape '\'};

db<>小提琴演示

于 2019-07-07T15:39:46.807 回答