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

本文探讨了进销存管理系统中编码生成的两种常见方法及其潜在问题,并提供了一个使用存储过程改进编码生成效率和并发性的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值