一尘不染

使用sql参数在SQL LIKE语句中转义特殊字符

sql

我有一张桌子,上面放着产品。我需要进行查询,以找到所有与用户输入值匹配的结果。我正在使用SqlParameter输入的插入。

SqlCommand findProcutsByPattern = new SqlCommand(
    "SELECT *" +
    " FROM [Products]" +
    " WHERE ProductName LIKE @pattern", connection);

findProcutsByPattern.Parameters.AddWithValue("@pattern", '%' + pattern + '%');

当用户输入字符串包含“ _”或“%”时,就会出现问题,因为它们被解释为特殊字符。另一方面,请考虑以下因素:

命令对象使用参数将值传递给SQL语句或存储过程,从而提供类型检查和验证。与命令文本不同,参数输入被视为文字值,而不是可执行代码。

我不应该有这样的问题。我是否需要替换/转义输入字符串中的所有“ _”和“%”,还是有一个更优雅的解决方案?我希望将输入视为文字。

我在表中有一些记录,这些记录的名称中包含特殊字符(N_EW,N \ EW,N%EW,N” EW,N’EW)。将 ** , ”**
指定为输入效果很好(考虑它们作为文字)。


阅读 240

收藏
2021-05-05

共1个答案

一尘不染

您有两种选择:

  • 将它们包含在[和中]。所以:
    where pattern like '[%]'
    

查找百分比字符。要转义的字符的完整列表- '_', '%', '[', ']'带有相应的替换'[_]', '[%]', '[[]', '[]]'。可以在转义转义符不起作用的示例代码中找到SQLLIKE运算符

  • 使用不太可能出现在字符串中的转义字符,例如反引号:
    where pattern like '`%' escape '`'
    

(请参阅MSDN- LIKE(Transact-SQL)上的语法。)

在这两种情况下,我都建议您在应用程序层进行替换,但如果您确实需要,也可以在SQL中进行替换:

where pattern like replace(@pattern, '%', '[%]')

而且,就用户界面而言,向最终用户提供通配符访问权限可能是一件好事。


注:有几个比较特殊的字符'-',并'^'在LIKE查询,但他们并不需要,如果你已经逃离转义'['']'

2021-05-05