1. 程式人生 > 資料庫 >通過SQL自動新增流水號

通過SQL自動新增流水號

 專案中往往有一些單據流水號或者流程流水號是希望通過新增一條記錄後自動產生一個編號的,比如新增一條流程就自動根據當前日期自動新增該流程的流程流水號,下面介紹兩種不同型別流水號通過SQL自動產生的方法。

流水號格式:

  第一種(數值型別):日期+流水號,比如“201104190001”-->"201104190002"; 

  第二種(文字型別):字首+日期+流水號,比如“WT201104190001”-->"WT201104190002"。

      不論哪種情況,流水號的生成原則都是一樣的,流水號的產生都需要根據當前日期產生,新增的一條記錄的流水號為當前日期下所有記錄中流水號最大那條加1得來。

一、資料庫中新增一個表

:TestNo

       列名       資料型別                   說明

       ID         uniqueidentifier          主鍵

       No         bigint                        流水號欄位,不過是純數字型的流水號,這個為本例子的第一種情況,流水號可以為純數字

       DT         datetime                   新增一條記錄的當前時間,相信每新增一條記錄都會記錄這次操作的當前時間的。

       CharNo   varchar(50)               流水號欄位,不過是可以有字元的流水號,這個為本例子的第二種情況。

二、SQL程式碼

------
--自動流水號為純數字的情況,如 201104190005
------
declare
@x int,
@y char(8)
select @x= COUNT(no) from TestNo where CAST(DT as date)=CAST(GETDATE() as date)
if(@x=0)
begin
select @y=convert(char(8),getdate(),112)
insert TestNo(No,DT) values(
@y+'0001'
,GETDATE())
end
else
  insert TestNo(No,DT) values(
(select MAX(No)+1 from TestNo where CAST(DT as date)=CAST(GETDATE() as date))
,GETDATE())
select * from TestNo
 
------
--自動流水號為字元的情況,如 WT201104190005
------
declare
@x1 int,
@y1 char(8)
select @x1= COUNT(CharNo) from TestNo where CAST(DT as date)=CAST(GETDATE() as date)
if(@x1=0)
begin
select @y1=convert(char(8),getdate(),112)
insert TestNo(CharNo,DT) values(
'WT'+@y1+'0001'
,GETDATE())
end
else
begin
  insert TestNo(CharNo,DT) values(
'WT'+cast((select MAX(CAST( SUBSTRING(charno,3,12) as bigint))+1 from TestNo where CAST(DT as date)=CAST(GETDATE() as date))as varchar(50))
,GETDATE())
end
select * from TestNo

三、自己改寫的例子(假如表中沒有現成的建立時間)

ALTER FUNCTION [dbo].[udf_GenerateCutSampleNo]()  
RETURNS varchar(20)  
AS  
BEGIN  
DECLARE @rtn VARCHAR(20) 
--每日流水號歸零
DECLARE @countOfToday int,@ymd char(8)
--如果“ID”裡沒有今天的資料
select @countOfToday= COUNT(1) FROM dbo.CutSampleDtl WHERE  CAST(RIGHT(LEFT(Sample_No,9),8) AS DATE)=CAST(GETDATE() as date)
if(@countOfToday=0)
begin
select @ymd=convert(char(8),getdate(),112)
SET @rtn= 'D'+@ymd+'0001'
end
else
begin
SET @rtn= 'D'+cast((select MAX(CAST( SUBSTRING(Sample_No,2,12) as BIGINT))+1 from dbo.CutSampleDtl)as varchar(50))
end
RETURN  @rtn
END