高效獲取最大流水號(最大單號)的設計

2021-09-29 22:16:03 字數 1036 閱讀 7603

業務背景:訂單號由三部分組成:字首+日期+流水,要求每天流水從001開始,連續,長度超出時自動進製。例如 inv191125001 , inv191125999 , inv1911251000

系統設計:

獲取最大單號的方法對所有單據型別通用,所以用動態拼接指令碼獲取

所有單據包含如下固定列:billno(單號),creationtime(建立時間)

creationtime必填且必須從資料庫取預設值getdate()

新的單號 = 獲取當前最大單號 + 1

獲取最大單號實現如下:

declare @pre varchar(64)

declare @predate varchar(8)

set @pre = 'inv'

set @predate = right(convert(varchar(100), dateadd(dd, 0, getdate()), 112), 6)

set @pre = @pre + @predate

select top 1 billno

from invbillmaster

where creationtime >= dateadd(day, 0, datediff(day, 0, getdate())) and billno like @pre + '%'

order by creationtime desc

**解釋:

1,拼接出今天的字首 pre = 『inv』 + 『191125』

2,從今天的單據中過濾出字首等於pre的單據,獲取最大creationtime

3,獲取最大creationtime的單號

剩下的就是用最大單號解析出後三位整數+1得到新流水

主要有問題如下:

1,只要併發就會導致後一條記錄插入時單號重複而報錯,重新提交可以緩解,肯定不適合高併發場景

2,如果伺服器時間發生修改,導致後插入的creationtime小於前面的記錄,將導致再也獲取不到最大單號

不知道整個設計有沒有問題

sql 獲取最大的流水號

exec zkmc public getquoreceivedocsn sp 建立人 lj 標籤拆分的sn alter proc dbo zkmc public getquoreceivedocsn headstr nvarchar 10 as begin declare date datetime...

解決ms serer 2000 最大流水號問題

方案一 使用scope identity取得剛剛插入的最大流水號 建立traddeinfo表各相關索引,注意trade id欄位必段是identity型 create table tradeinfo trade id int identity 1,1 tdtime datetime tdname v...

流水號自動補號和計算所缺最小號和最大號

自已做標識列的例子,不自動重排編號,而是自動補號 建立得到最大id的函式 create function f getid returns char 3 asbegin declare idint ifnot exists select 1from tb whereid 001 set id 1 el...