在WHERE子句中添加LIKE运算符(动态SQL)

在WHERE子句中添加LIKE运算符(动态SQL),sql,sql-server,where-clause,dynamic-sql,sql-like,Sql,Sql Server,Where Clause,Dynamic Sql,Sql Like,我正在使用动态SQL创建一个将被执行的“SELECT”SQL语句。在我正在创建的SQL语句中,我想使用'LIKE'运算符,但由于它使用的是倒逗号',因此它与'SELECT'语句开头使用的倒逗号冲突 SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE ' + @ApplicationName + ' ;' 假设'@ApplicationName=TestApp',上述动态SQL'@SQL'变量将生成以下SQL语句: SELECT *

我正在使用动态SQL创建一个将被执行的“SELECT”SQL语句。在我正在创建的SQL语句中,我想使用'LIKE'运算符,但由于它使用的是倒逗号',因此它与'SELECT'语句开头使用的倒逗号冲突

SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE ' + @ApplicationName + ' ;'
假设'@ApplicationName=TestApp',上述动态SQL'@SQL'变量将生成以下SQL语句:

SELECT * FROM LogTable WHERE Application LIKE TestApp ;
这将导致错误,因为“TestApp”周围不存在倒逗号。如何在允许使用“LIKE”运算符的动态SQL中创建倒逗号?如何创建下面的SQL语句:

SELECT * FROM LogTable WHERE Application LIKE 'TestApp' ;

您需要自己将引号添加到SQL中。您可以通过使用其中两个引号来避开单个引号:

SET @sql = 
    'SELECT * FROM LogTable WHERE Application LIKE ''' + @ApplicationName + ''';'

您需要自己将引号添加到SQL中。您可以通过使用其中两个引号来避开单个引号:

SET @sql = 
    'SELECT * FROM LogTable WHERE Application LIKE ''' + @ApplicationName + ''';'

我将使用
SP_EXECUTESQL
,您不必担心单引号

Declare  @sql NVARCHAR(max)

SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE  @ApplicationName ;'

EXEC Sp_executesql
  @sql,
  N'@ApplicationName varchar(100)',
  @ApplicationName = @ApplicationName 

这也避免了SQL注入

我将使用
SP_EXECUTESQL
,其中您不想担心单引号

Declare  @sql NVARCHAR(max)

SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE  @ApplicationName ;'

EXEC Sp_executesql
  @sql,
  N'@ApplicationName varchar(100)',
  @ApplicationName = @ApplicationName 


此外,这还可以避免SQL注入

此外,您不必担心SQL注入攻击。总是,只是总是,像这样使用参数化查询:)如果有人在搜索带有
的内容,你不必担心。这与我刚才说的是同一点。如果字符串文本包含一个
,那么您准备好的语句可以很好地处理它,但是OP的结构将失败,因为SQL中有类似“Fred's App”(中间的
导致字符串终止,
s App
成为语法错误),您不必担心SQL注入攻击。总是,只是总是,像这样使用参数化查询:)如果有人在搜索带有
的内容,你不必担心。这与我刚才说的是同一点。如果字符串文本包含一个
,那么您准备好的语句可以很好地处理它,但是OP的结构将失败,因为SQL中有类似“Fred's App”(中间的
导致字符串终止,
s App
成为语法错误)。即使您能够正常工作,当心小桌子。如果他搜索过
%TestApp%”;升降台;选择“您刚刚受到SQL注入攻击”
,您可能会得到“意外结果”!出于对所有事物的热爱,请不要使用这种结构,而是使用参数化查询(又名准备语句)。为什么要使用没有通配符的like搜索?还有,如果它像这样简单,为什么还要首先使用动态SQL?我打算实现一个MVC应用程序,其中应该有一个带有预定义值的下拉列表。选择这些值应更改@ApplicationName。我打算使用“LIKE”,这样当选择空字段时,它会将“LIKE”运算符搜索词替换为“%”以显示所有内容。仍然没有解释为什么需要动态SQL您是否在应用程序中创建文本并将其传递给SQL?还是你在用SQL构建?在这两种情况下,最好用接受参数的SQL存储过程替换它,当参数为null时,返回所有内容。即使您可以这样做,也要小心小Bobby表。如果他搜索过
%TestApp%”;升降台;选择“您刚刚受到SQL注入攻击”
,您可能会得到“意外结果”!出于对所有事物的热爱,请不要使用这种结构,而是使用参数化查询(又名准备语句)。为什么要使用没有通配符的like搜索?还有,如果它像这样简单,为什么还要首先使用动态SQL?我打算实现一个MVC应用程序,其中应该有一个带有预定义值的下拉列表。选择这些值应更改@ApplicationName。我打算使用“LIKE”,这样当选择空字段时,它会将“LIKE”运算符搜索词替换为“%”以显示所有内容。仍然没有解释为什么需要动态SQL您是否在应用程序中创建文本并将其传递给SQL?还是你在用SQL构建?在这两种情况下,最好用接受参数的SQL存储过程替换它,当参数为null时返回所有内容。您刚刚帮助某人打开了他们的代码以抵御SQL注入攻击。您刚刚帮助某人打开了他们的代码以抵御SQL注入攻击。