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

zhu*_*ien 4 c# sql sql-server escaping sqlparameter

我有一张包含产品的表格.我需要查询查找所有匹配结果到用户输入值.我SqlParameter用于插入输入.

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

findProcutsByPattern.Parameters.AddWithValue("@pattern", '%' + pattern + '%');
Run Code Online (Sandbox Code Playgroud)

当用户输入字符串包含'_'或'%'时,问题就出现了,因为它们被解释为特殊字符.另一方面,考虑到这一点:

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

我不应该有这样的问题.我是否需要替换/转义输入字符串中的所有'_'和'%',或者是否有更优雅的解决方案.我希望输入被视为文字.

我在表中有一些记录,其中包括名称中的特殊字符(N_EW,N\EW,N%EW,N"EW,N'EW).指定\,"'作为输入工作正常(考虑它们)作为文字).

Gor*_*off 9

您有两种选择:

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

where pattern like replace(@pattern, '%', '[%]')
Run Code Online (Sandbox Code Playgroud)

并且,在用户界面方面,让最终用户访问通配符可能是一件好事.


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