由于项目需要要写个自动生成编号的问题,但是这个代码还是有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
/*
过程说明:生成自动编号
创建时间: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

浙公网安备 33010602011771号