日期:2014-05-18  浏览次数:20446 次

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


------解决方案--------------------
这个要求很不合理
人员编号首先要求唯一,应该是不删除的,只能逻辑删除

用:select Max(code) from TB_emp 选出一个最大的编号加上1的方法也是不安全的,同时两个人操作就可能出问题,至少会出现空号


------解决方案--------------------
--先生成一个包含1000条记录的临时表
select top 1000 Identity(int,1,1) as ID
into #t
from syscolumns a ,syscolumns b

exec ( '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

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

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 lsb

create 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 tb

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