如何在存储过程中的动态SQL中使用LIKE?

时间:2016-07-15 02:21:31

标签: sql sql-server stored-procedures dynamic-sql

我使用动态SQL编写了一个存储过程:

create procedure [dbo].[SearchProduct]
    (@ProductId int = null, @ProductName nvarchar(50) = null)
as
    declare @SqlStr nvarchar(max)
    declare @ParaList nvarchar(2000)

    set @SqlStr = 'select p.* from dbo.Product where (1=1) '

    if @ProductName is not null
       set @SqlStr = @SqlStr + 'and(p.ProductName like '''%' + @ProductName2+'%''')'

    set @ParaList='@ProductId2 int , @ProductName2 nvarchar(50)'

    EXECUTE SP_EXECUTESQL @SqlStr,@ParaList,@ProductId,@ProductName

但是我收到了一个错误:

  

错误"喜欢运营商" :数据类型varchar和varchar在模运算符中不兼容。

如果我改变:

set @SqlStr = @SqlStr + 'and(p.ProductName like ''%' + @ProductName2+'%'')'

我明白了:

  

@ ProductName2未声明。

3 个答案:

答案 0 :(得分:0)

你有两个或两个以上的引用:

if @ProductName is not null
    set @SqlSt r = @SqlStr + 'and (p.ProductName like ''%' + @ProductName2+'%'')';

在字符串中,两个单引号表示字符串中的一个单引号。第三个单引号然后结束字符串。

答案 1 :(得分:0)

由于您对此有所了解,请接受我的这些说明:

  1. 关于您的问题...您的选择语句以where结尾,您可以使用and
  2. 关注它

    select p.* from dbo.Product where '

    %之前,您应该只有2个单引号而不是3 .. Like ' '%' +.... + '%' '...

    1. 当你做动态的sql程序时,首先使用print()方法而不是exec来评估你的sql。

    2. 使用case when语句代替if statements.它会更好地组织您的代码。

    3. 因为动态sql实际上是非常糟糕的做法...你的问题应该是"如何将这个程序转换为普通的sql而不是动态..."

    4. 最后,请接受我的抱歉,因为我从手机接听时没有样品,错误和帮助链接。

答案 2 :(得分:0)

应该在下面。你错误地单引号

if @ProductName is not null
     set @SqlStr=@SqlStr+'and(p.ProductName like ''% + @ProductName2 + %'')'