我使用动态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未声明。
答案 0 :(得分:0)
你有两个或两个以上的引用:
if @ProductName is not null
set @SqlSt r = @SqlStr + 'and (p.ProductName like ''%' + @ProductName2+'%'')';
在字符串中,两个单引号表示字符串中的一个单引号。第三个单引号然后结束字符串。
答案 1 :(得分:0)
由于您对此有所了解,请接受我的这些说明:
where
结尾,您可以使用and
select p.* from dbo.Product where '
在%
之前,您应该只有2个单引号而不是3 .. Like ' '%' +.... + '%' '...
当你做动态的sql程序时,首先使用print()
方法而不是exec来评估你的sql。
使用case when
语句代替if statements.
它会更好地组织您的代码。
因为动态sql实际上是非常糟糕的做法...你的问题应该是"如何将这个程序转换为普通的sql而不是动态..."
最后,请接受我的抱歉,因为我从手机接听时没有样品,错误和帮助链接。
答案 2 :(得分:0)
应该在下面。你错误地单引号
if @ProductName is not null
set @SqlStr=@SqlStr+'and(p.ProductName like ''% + @ProductName2 + %'')'