自动编号(用当前时间生成编号)

本文介绍了一种使用SQL生成带有日期前缀的自增编号的方法,并提供了两种函数实现:一种是简单地生成下一个可用编号;另一种则能处理编号缺失的情况,确保编号连续。这两种方法对于需要特定编号格式的应用场景非常有用。

       我们经常设置表的ID的时候都是用IDENTITY来产生编号,或者用Default(newID()),产生出来的编号是一串字母的组合,这是最经常用的办法。
      下面的代码是用时间的年和月加上一串自定义的编号组成新的编号,并提供了补号的方法,也就是说当用户表中某条信息删除的时候,我们要将个编号补上,比哪开始编号为1001,1002,1003,当我们删除1002的时候,再插入新的一行的时候,编号会变成1001,1003,1004,可是这也许不是我们想要的,我们想要的是在新插入一行时编号是1001,1002,1003,下面提供了补号与不补号两个函数的测试。当然这种东西也很少碰到,但有时候还是挺有用的。


--建表语句
CREATE TABLE [MyTable] (
    
[MyId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[MyName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
ON [PRIMARY]
GO

--得到新的编号(不考虑补号)
create function f_NextID(@myDate datetime)
Returns char(12)
as
begin 
    
Declare @temp char(6)
     
Declare @ret char(12)
    
set @temp=Substring(Convert(char,@myDate),9,2)+Substring(Convert(char,@myDate),1,2)+Substring(Convert(char,@myDate),4,2)
    
if(@temp in (SELECT distinct myid=left(myid,6FROM mytable WITH(XLOCK,PAGLOCK)))
            
Select @ret=@temp+right(1000001+Isnull(Max(Right(MyID,6)),0),6from Mytable with(xlock,paglock) where @temp=left(MyID,6)
    
else
        
Select @ret=@temp+'000001' from Mytable with(xlock,paglock)
    
return @ret
end 
GO


drop table MyTable
--建表语句
CREATE TABLE [MyTable] (
    
[MyId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    
[MyName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
ON [PRIMARY]
GO

--得到新的编号(融合了补号处理)
create FUNCTION f_NextNewID(@myDate datetime)
RETURNS char(12)
AS
BEGIN
    
Declare @temp char(6)
     
Declare @ret char(12)
    
set @temp=Substring(Convert(char,@myDate),9,2)+Substring(Convert(char,@myDate),1,2)+Substring(Convert(char,@myDate),4,2)
    
DECLARE @r char(12)
    
    
SELECT @r=@temp+RIGHT(1000001+MIN(MyId),6)
    
FROM(
        
SELECT MyId=RIGHT(MyId,6FROM MyTable WITH(XLOCK,PAGLOCK)
        
UNION ALL SELECT 0
    )a 
  
WHERE NOT EXISTS(
        
SELECT * FROM MyTable  WITH(XLOCK,PAGLOCK)
        
WHERE MyId=@temp+RIGHT(1000001+a.myID,6))
    
RETURN(@r)
END
GO


--测试语句(可改变时间测试一下)
insert MyTable values (dbo.f_NextNewID(GetDate()),'one')
insert MyTable values (dbo.f_NextNewID(GetDate()),'two')
insert MyTable values (dbo.f_NextNewID(GetDate()),'three')
insert MyTable values (dbo.f_NextNewID(GetDate()),'four')
insert MyTable values (dbo.f_NextNewID(GetDate()),'five')
insert MyTable values (dbo.f_NextNewID(GetDate()),'six')
Select * from MyTable order by MyId
GO
delete MyTable where myId='060629000002'
delete MyTable where myId='060629000005'
Select * from MyTable order by MyId
Go
insert MyTable values (dbo.f_NextNewID(GetDate()),'nexttwo')
insert MyTable values (dbo.f_NextNewID(GetDate()),'nextfive')
Select * from MyTable order by MyId
GO


 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值