如何在存储过程中动态使用LIKE SQL?
How to use LIKE in dynamic SQL in a stored procedure?
我使用动态写了一个存储过程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
但是我得到一个错误:
Error in "Like operator" : The data types varchar and varchar are incompatible in the modulo operator.
如果我改变:
set @SqlStr = @SqlStr + 'and(p.ProductName like ''%' + @ProductName2+'%'')'
我得到:
@ProductName2 not declare.
你引用的一两句太多了:
if @ProductName is not null
set @SqlSt r = @SqlStr + 'and (p.ProductName like ''%' + @ProductName2+'%'')';
在一个字符串中,两个单引号代表字符串中的一个单引号。第三个单引号结束字符串。
由于您对此很陌生,请接受我的这些说明:
- 至于你的问题...你的 select 语句以
where
结尾,然后是 and
select p.* from dbo.Product where '
同样在 %
之前你应该只有 2 个单引号而不是 3.. Like ' '%' +.... + '%' '...
当您执行动态 sql 过程时,始终首先使用 print()
方法而不是 exec 来评估您的 sql。
使用 case when
语句而不是 if statements.
它将更好地组织您的代码。
因为动态 sql 确实是非常糟糕的做法......你的问题应该是 "how to convert this procedure to normal sql instead of dynamic..."
最后,对于我从手机 phone 回答时缺少示例、错误和帮助链接,请接受我的歉意。
应该在下面。你用错了单引号
if @ProductName is not null
set @SqlStr=@SqlStr+'and(p.ProductName like ''% + @ProductName2 + %'')'
我使用动态写了一个存储过程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
但是我得到一个错误:
Error in "Like operator" : The data types varchar and varchar are incompatible in the modulo operator.
如果我改变:
set @SqlStr = @SqlStr + 'and(p.ProductName like ''%' + @ProductName2+'%'')'
我得到:
@ProductName2 not declare.
你引用的一两句太多了:
if @ProductName is not null
set @SqlSt r = @SqlStr + 'and (p.ProductName like ''%' + @ProductName2+'%'')';
在一个字符串中,两个单引号代表字符串中的一个单引号。第三个单引号结束字符串。
由于您对此很陌生,请接受我的这些说明:
- 至于你的问题...你的 select 语句以
where
结尾,然后是and
select p.* from dbo.Product where '
同样在 %
之前你应该只有 2 个单引号而不是 3.. Like ' '%' +.... + '%' '...
当您执行动态 sql 过程时,始终首先使用
print()
方法而不是 exec 来评估您的 sql。使用
case when
语句而不是if statements.
它将更好地组织您的代码。因为动态 sql 确实是非常糟糕的做法......你的问题应该是 "how to convert this procedure to normal sql instead of dynamic..."
最后,对于我从手机 phone 回答时缺少示例、错误和帮助链接,请接受我的歉意。
应该在下面。你用错了单引号
if @ProductName is not null
set @SqlStr=@SqlStr+'and(p.ProductName like ''% + @ProductName2 + %'')'