由于项目需要要写个自动生成编号的问题,但是这个代码还是有bug存在,选择截取的字段不能超过数据库已经定义的长度
代码
--exec  [P_AutoGenerateNumber]  'reception_apply','generate_code','',7
/*

 过程说明:生成自动编号 
 创建时间:2010年1月12日
 作者:feng
 debug:尚未考虑编号溢出情况
*/ 
ALTER proc [P_AutoGenerateNumber]
  (
  
@tableName varchar(100)='meeting_apply'--表名
  @byteName varchar(100)='generate_code',  --字段名
  @Remark   varchar(10)='M',   --标示
  @subLen   int=4            --截取长度
  )
  
WITH  ENCRYPTION   
  
as
   
  
declare   @SQLString   NVARCHAR(4000)   
  
declare   @OutputValue   int 
  
declare   @subLenVar   NVARCHAR(20
  
declare   @TempValue varchar(20)

  
set @subLenVar =convert(varchar(20),@subLen)
  
set @TempValue ='00000000000000000000'  
 
  
declare @OutputValueToVar varchar(20)
  
  
set @SQLString = N'select @OutputValueEx=count(*) from    '+@tableName+' where '+@byteName+' is not null or '+@byteName+'!=''''' 
  
EXECUTE   sp_executesql   @SQLString,   N'@OutputValueEx int output',@OutputValueEx= @OutputValue  output
  
  
if @OutputValue !=0  
  
begin
   
SET   @SQLString   =  N'SELECT  @OutputValueEx=max(cast(right('+@byteName+','+@subLenVar+') as int))+1   FROM   '+@tableName+' where '+@byteName+' is not null or '+@byteName+'!=''''' 
   
EXECUTE   sp_executesql   @SQLString,   N'@OutputValueEx int output',@OutputValueEx= @OutputValue  output
   
set @OutputValueToVar = cast(@OutputValue as varchar(20))
   
select @Remark+right(@TempValue,@subLen-len(@OutputValueToVar))+@OutputValueToVar as autocode
  
end
  
else  --尚未生成编号
     select @Remark+right(@TempValue,@subLen-1)+'1' as autocode