【问题标题】:Using LIKE in sp_executesql在 sp_executesql 中使用 LIKE
【发布时间】:2010-08-24 12:43:48
【问题描述】:

SET @whereCond = @whereCond + ' AND name LIKE ''%'' + @name + ''%'''

这里有什么问题吗?在生成 where 条件后,我使用sp_executesql 执行它,但我确实得到了任何东西。当我在没有 sp 的情况下选择相同的东西时,没关系。

如何在 sp_executesql 中使用 LIKE?可以举一些例子吗?

谢谢。

更新

declare @name nvarchar(50)

set @name = 'a'

SELECT *
    FROM Tbl_Persons WHERE 1 = 1  AND lastname LIKE '%a%' 

exec sp_executesql 
  N'SELECT *
    FROM Tbl_Persons WHERE 1 = 1  AND lastname LIKE ''%@name%''', 
  N'@name nvarchar(50)',
  @name=@name

第一个查询返回值,第二个不返回任何值。

有什么区别?

【问题讨论】:

    标签: sql-server sql-server-2008 sp-executesql


    【解决方案1】:

    以下对我有用

    declare @name varchar(50)
    
    set @name = 'WAITFOR'
    
    
    exec sp_executesql 
      N'select * from sys.messages WHERE text  LIKE ''%'' + @name + ''%''', 
      N'@name varchar(50)',
      @name=@name
    

    我认为问题一定出在其他地方。

    编辑:更新后您需要使用

    exec sp_executesql 
      N'SET @name = ''%'' + @name + ''%'';
        SELECT *
        FROM Tbl_Persons WHERE 1 = 1  AND lastname LIKE @name', 
      N'@name nvarchar(50)',
      @name=@name
    

    就目前而言,您正在搜索包含实际子字符串 @name 的文本

    【讨论】:

    • 我检查了你的脚本,它工作正常,但我的不工作。我已经编辑了我的问题。谢谢。
    • 为什么这里需要这个赋值 '@name=@name',是不是仅仅通过 @name 就够了?
    • @IKriKan 第一个名称是查询表达式中使用的参数,第二个名称是包含值的变量(应该替换参数)。不过我更喜欢给它们起不同的名字。
    • 这在@name 包含撇号字符(单引号)时不起作用,例如 D'souza
    • 参见例如declare @name varchar(50) set @name = 'it''s' exec sp_executesql N'select * from sys.messages WHERE text LIKE ''%'' + @name + ''%''', N'@name varchar(50)', @name=@name,它返回这些结果i.stack.imgur.com/l8XRv.png
    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2012-07-16
    • 1970-01-01
    • 2014-04-14
    • 2015-10-18
    相关资源
    最近更新 更多