当前位置: 代码迷 >> 综合 >> 技巧:关于取最大编码的一些思考
  详细解决方案

技巧:关于取最大编码的一些思考

热度:71   发布时间:2024-01-22 05:59:01.0

  很长时间没有开发系统了,最近上班比较闲想自己开发一个进销存管理系统,遇到一些技术问题。发现一些问题细究起来还是挺有学问的,现在就在此记录一些我的想法。

  生成编码其实是很简单的问题,其实细细想起并不简单,想想现在大家通用的方法应该有以下两种:
  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

  相关解决方案