在程序中做人员录入时点:“添加”按扭时自动得到一个数字编号,比如“001”,“002”,“003”,
所使的Sql语句是用:select Max(code) from TB_emp 选出一个最大的编号加上1,但是现在客户要求:如果“001”这个编号被删除了,而现在最大号是“008”,再生成新号的时候能把001这个编号给补回来,而不能是生成的最大编号,这种情况怎么处理?

解决方案 »

  1.   

    这个要求很不合理
    人员编号首先要求唯一,应该是不删除的,只能逻辑删除用:select Max(code) from TB_emp 选出一个最大的编号加上1的方法也是不安全的,同时两个人操作就可能出问题,至少会出现空号
      

  2.   

    --先生成一个包含1000条记录的临时表
    select top 1000 Identity(int,1,1) as ID
    into #t
    from syscolumns a ,syscolumns bexec ('alter table #t add 编号 varchar(10)')update #t set 编号=right('000' + cast(ID as varchar(10)),3)select * from #t--这样查询出来你需要的编号
    select min(编号) from #t where 编号 not in (select 编号 from 你的表)drop table #t
      

  3.   

    在删除的时候记录被删除的编号到另外一表(delete_no),取的时候从delete_no中取.insert后再将从delete_no中删掉这个编号
      

  4.   

    --改下:取999条--先生成一个包含999条记录的临时表
    select top 999 Identity(int,1,1) as ID
    into #t
    from syscolumns a ,syscolumns bexec ('alter table #t add 编号 varchar(10)')update #t set 编号=right('000' + cast(ID as varchar(10)),3)select * from #t--这样查询出来你需要的编号
    --select min(编号) from #t where 编号 not in (select 编号 from 你的表)drop table #t
      

  5.   


    select top 999 identity(int,1,1) as id into  lsb 
    from master..syscolumns,master..sysobjects
    alter table lsb add bh as right((1000+id),3) 
    --select * from lsbcreate table tb(bh char(3))
    insert into tb values('002')
    declare @bh char(3)
    select @bh=min(bh) from lsb a where not exists(select 1 from tb where bh=a.bh)
    insert into tb values(@bh)
    select @bh
    select @bh=min(bh) from lsb a where not exists(select 1 from tb where bh=a.bh)
    insert into tb values(@bh)
    select @bh
    select * from tbdrop table lsb,tb
      

  6.   

    我明白你的意思,我们以前老大也提过这样的问题,
    我是用触发器解决的,先假设这个表(t)有100k以上,如果删除t表中某条记录,则创建一个delete触发器,把该id保存一个表(d)中,再创建一个insert 触发器,每次向表插入一条记录时,就在d表中判断下没有有id,如果没有,则取t表max(id)+1,否则的话就取d 表中一个最小的
    id当作现在插入的id 号.
      

  7.   

    假设表为 tb
    字段为ID
    ---------
    create proc dbo.proc_findID
    as
    declare @ID varchar(3)
    begin
    begin tran
    set nocount on
    if not exists(select 1 from tb where id='001')
    set @ID='001'
    else
    begin
    set @ID=(select min(ID) from tb a where not exists(select 1 where ID=a.ID +1))
    select @ID=right(convert(varchar,(convert(int,@ID) + 1001)),3)
    end
    if @@error=0 
    commit tran
    else
    rollback tran
    select @ID

    end