很长时间没有开发系统了,最近上班比较闲想自己开发一个进销存管理系统,遇到一些技术问题。发现一些问题细究起来还是挺有学问的,现在就在此记录一些我的想法。
生成编码其实是很简单的问题,其实细细想起并不简单,想想现在大家通用的方法应该有以下两种:
1、从某个表中取出编码字段最大值+1,这应该是大多数编程者的方法
分析:其实这种作法还是有一定的弊端的,
a:并发性不够好,当多用户同时提交的时候容易产生重复编码
b:效率比较低,如果是业务表需要取字段的值,数据量大后容易速度慢
2、用一个表来保存当前编码的最大值
分析:此种作法也有一定弊端,容易产生断号
个人比较倾向第二种方法,我把它写成一个存储过程,希望对大家能有点启发
CREATE PROCEDURE GetMaxID
@field_name varchar(20) --字段名称
, @digit_flag varchar(1) --是否数字
, @max_id varchar(10) out
AS
/*
set @field_name='supplyer_code'
set @digitFlag='0'
*/
declare @maxID varchar(10)
declare @curID varchar(10)
declare @iMax varchar(10)
declare @iLength int --字符长度
declare @return_str varchar(50)
declare @sSql nvarchar(300)
begin tran
--取当前编码
set @sSql='select @maxID='+@field_name+' from 表名
exec sp_executesql @sSql,N'@maxID varchar(10) output',@maxID output
if @@ERROR<>0
begin
set @return_str='取当前编码出错'
goto error
end
if @digit_flag='1'
begin
set @iMax=convert(int,@maxID)
set @iMax=@iMax+1
set @curID=convert(varchar(10),@iMax)
end
else
begin
set @iLength=len(@maxID)
set @iMax=convert(int,@maxID)
set @iMax=@iMax+1
set @curID=right('0000000000'+convert(varchar(10),@iMax),@iLength)
end
--更新编码
set @sSql='update jxc_configure set goto error
end
set @max_id =@maxID
commit tran
return 1
error:
rollback tran
raiserror (@return_str,1,2)
return 0
GO