日期:2014-05-16  浏览次数:20493 次

存储过程语法

CREATE proc [dbo].[GetMaxNo] 
(@itemNo varchar(20) output,
 @biaoshi varchar(10),
 @ziduan varchar(20)
 )

as
begin
set nocount on
declare @maxNo varchar(20),@i int,@tsql nvarchar(4000)
 
set @maxNo=@biaoshi+'_'+replace(convert(varchar(10),getdate(),120),'-','')
 
select @tsql=N'select @i=isnull(max(right('+@ziduan+',4)),0)+1 from TableNumble where '+@ziduan+' like '''+@maxNo+'%'' '
 
exec sp_executesql @tsql,N'@i int output',@i=@i output
 
set @maxNo=@maxNo+'_'+right('0000'+cast(@i as varchar),4)

select @tsql=N'update TableNumble set ziduan='''+@maxNo+''' where flag='''+@biaoshi+''
 
exec sp_executesql @tsql 
   
set @itemNo=@maxNo

end




为什么这句执行出来的更新语句是这样的:

update TableNumble set ziduan='SP_20140331_0001' where flag='SP  

后面少了一个单引号   语法都没有提示错误
------解决方案--------------------
最后那个引号是整个动态语句的 
前面都3个引号 你后面也应该对应3个引号啊
------解决方案--------------------
where flag='''+@biaoshi+''

应该改成 
where flag='''+@biaoshi+''''

后面四个单引号
------解决方案--------------------
动态语句只会检查动态语句的语法,至于你exec  @tsql ,这个@tsql内部的语法是不会检测的。但是你执行 不会得到结果,这个也是动态sql 的缺陷之一(难调试),你可以改成下面这样:
select @tsql=N'update TableNumble set ziduan='''+@maxNo+''' where flag='''+@biaoshi+''‘’