当前位置:  开发笔记 > 编程语言 > 正文

在SQL Server中转义字符串,以便在LIKE表达式中使用它是安全的

如何解决《在SQLServer中转义字符串,以便在LIKE表达式中使用它是安全的》经验,为你挑选了3个好方法。

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

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

declare @myString NVARCHAR(100);

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

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

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

例如,给定:

@myString = 'aa%bb'

我想要:

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

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



1> Rory..:

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


@Lijo,没关系.这个答案可以在C#中进行转义,而上面的答案是在SQL中进行的,因为它不是C#特有的.无论哪种方式,结果都是相同的:转义搜索字符串中的任何特殊字符,并在LIKE语句中使用ESCAPE关键字.

2> Dries Van Ha..:

有一个类似的问题(使用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



3> Martin Smith..:

假设您在模式中使用前导通配符,而不是转义字符串中具有特定意义的字符串中的所有字符,这样做更快更容易.

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

如果您没有使用前导通配符,则应避免使用上述方法,因为它无法使用索引YourColumn.

此外在情况下,最佳的执行计划将根据使用时的估计可能是更好的匹配的行的数目而变化LIKE与方形支架相比时逸出语法两者CHARINDEX和所述ESCAPE关键字.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有