【问题标题】:How to use LIKE in a t-sql dynamic statement in a stored procedure?如何在存储过程的 t-sql 动态语句中使用 LIKE?
【发布时间】:2011-03-21 20:58:32
【问题描述】:

我正在尝试将 LIKE 关键字与包含参数的 % 通配符一起使用,但我不确定如何在不破坏语句的情况下将 % 字符放入语句中。现在我有:

SET @SQLQuery = 'SELECT * FROM [tblApps] WHERE [firstName] LIKE %@search%'

我在我的 .net 应用程序中收到一个 SqlException 错误,提示“当我运行它时,'@search' 附近的语法不正确。如果我删除 @search 参数周围的 % 字符,该错误就会消失。

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    % 字符必须是 in 搜索字符串...

    SET @search = '%' + @search + '%'
    SET @SQLQuery = 'SELECT * FROM [tblApps] WHERE [firstName] LIKE @search'
    

    请注意,以下方法也可以使用,但会引入 SQL 注入漏洞的可能性...

    -- DON'T do this!
    SET @SQLQuery = 'SELECT * FROM [tblApps] WHERE [firstName] LIKE ''%' + @search + '%'''
    

    【讨论】:

      【解决方案2】:
      SET @SQLQuery = 'SELECT * from [tblApps] WHERE [firstName] LIKE ''%'' + @search + ''%'''
      exec sp_executesql @query=@SQLQuery, @params=N'@search nvarchar(96)', @search=@search
      

      与其他版本相比,此版本的唯一区别是 sql 的动态执行实际上是参数化的,这可以稍微减轻 sql 注入。

      【讨论】:

      • 就我而言,这部分应该是:N'%' + @search + '%' - 不需要额外的单引号
      【解决方案3】:
      SET @search = '%' + @search 
      SET @SQLQuery = 'SELECT * FROM [tblApps] WHERE [firstName] LIKE ' + @search + '%'
      

      【讨论】:

        【解决方案4】:

        这对我有用!

        SET @search = '''%' + @search + '%'''
        SET @SQLQuery = 'SELECT * FROM [tblApps] WHERE [firstName] LIKE' + @search
        EXEC sp_executesql @SQLQuery
        

        【讨论】:

        • 这不会参数化 @search 变量,并且会受到 SQL 注入攻击。这与 AvPinzur 的回答中的 不要这样做 部分相同。
        【解决方案5】:
        declare @Cmd nvarchar(2000)
        declare @eName varchar(10)
        set @eName='a'
        set @Cmd= 'select * from customer1 where name LIKE '''+'%' +@eName+ '%' + ''''
        print @Cmd
        EXECUTE sp_executesql @Cmd
        

        【讨论】:

        • 我打算投反对票,但改变了主意,简单地说:你的方法有效,但它对 sql 注入开放
        猜你喜欢
        • 1970-01-01
        • 2015-07-26
        • 2013-07-16
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多