生成唯一性流水号

1、表结构和效果图,这个表是用来存储基础因子的,需要的可以拓展字段,比如,升序,降序,起始序号等。

SQL code
CREATE TABLE [dbo].[SerialNo]( 
    [sCode] [varchar](50) NOT NULL,--主键也是多个流水号的类别区分 
    [sName] [varchar](100) NULL,--名称,备注形式 
    [sQZ] [varchar](50) NULL,--前缀 
    [sValue] [varchar](80) NULL,--因子字段 
 CONSTRAINT [PK_SerialNo] PRIMARY KEY CLUSTERED 
( 
    [sCode] ASC 
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, 

 ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] 
) ON [PRIMARY] 

2、存储过程代码

Create procedure [dbo].[GetSerialNo]   
(   
    @sCode varchar(50)   
)   

  as 

--exec GetSerialNo   

begin 

Declare @sValue  varchar(16),   
    @dToday   datetime,           
    @sQZ  varchar(50)  --这个代表前缀 
Begin Tran     
Begin Try   

-- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了 
--在同一个事物中,执行了update语句之后就会启动锁 
Update SerialNo set sValue=sValue where sCode=@sCode   

     Select @sValue = sValue From SerialNo where sCode=@sCode   

     Select @sQZ = sQZ From SerialNo where sCode=@sCode   

     -- 因子表中没有记录,插入初始值   

     If @sValue is null   

     Begin 

       Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001')   

       Update SerialNo set sValue=@sValue where sCode=@sCode   

     end else   

     Begin               --因子表中没有记录   

       Select @dToday = substring(@sValue,1,6)   

       --如果日期相等,则加1   

       If @dToday = convert(varchar(6), getdate(), 12)   

         Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))   

       else              --如果日期不相等,则先赋值日期,流水号从1开始   

         Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001')   
       Update SerialNo set sValue =@sValue where sCode=@sCode   

     End 

     Select result = @sQZ+@sValue     

     Commit Tran   

   End Try   

   Begin Catch   

     Rollback Tran   

     Select result = 'Error' 

   End Catch   

end

exec getserialno ‘service’


另外一个:

代码
DROP PROCEDURE PRO_AutoLSH
 GO
 CREATE PROCEDURE PRO_AutoLSH
(    
 @letter varchar(10),    --首字母,可以多个字母    
@LSHkey varchar(20),    --表中的流水号列名,最好是主键    
@tablename varchar(20)     --表名
)
AS
begin 
    DECLARE @LSHID  NVARCHAR(20)    
    DECLARE @TLSH   VARCHAR(20)    
    DECLARE @NUM    INT    
    DECLARE @sql    NVARCHAR(200) 
    ----查询该表最大的流水号    
    SET @sql='SELECT ISNULL(MAX(CONVERT(INT,SUBSTRING('+@LSHkey+',8,4))),0)+1 FROM '+@tablename    
    --创建临时表    
    CREATE TABLE TEMP1(TOTAL INT);    
    --写入查询得到的数据    
    INSERT INTO TEMP1 EXEC(@sql);    
    --再查询出值    
    SET @NUM=(SELECT TOTAL FROM TEMP1)    
    DROP TABLE TEMP1        
    --拼接下一个流水号:J+年份4位+月份2位+4位编号(如J2010120001)    
    SET @TLSH=@letter+SUBSTRING(CONVERT(VARCHAR(100),GETDATE(),112),1,6)+SUBSTRING(CONVERT(CHAR(5),10000+@NUM),2,4)    
    SET @sql=''        
    SET @sql='SELECT @LSH='+''''+@TLSH+''''+' FROM '+@tablename 

    EXEC sp_executesql @sql,N'@LSH NVARCHAR(20) OUTPUT',@LSHID OUTPUT SELECT @LSHID
end

你可能感兴趣的:(生成唯一性流水号)