首頁 > 資料庫 > SQL > 主體

SQL server高並發生成唯一訂單號

藏色散人
發布: 2020-08-29 12:01:38
轉載
2725 人瀏覽過

前言

前幾天寫了一篇MySQL高並發生成唯一訂單號碼的方法,有人私訊問有沒有SQL server版本的,今天中午特地寫了SQL server版本的高並發生成唯一訂單號實現,其實MySQL和SQL server原理都一樣,主要是他們部分文法有些區別,所以你會發現我這篇文章文字說明幾乎一樣,只有程式碼和介面不一樣。

推薦:《SQL教學

一、場景再現

在一個erp進銷存系統或0A等其他系統中,如果多人同時進行產生訂單號碼的操作的話,容易出現多人獲得同一個訂單號的情況,對公司業務造成不可挽回的損失

二、如何避免高並發情況訂單號不唯一

我們可以利用預存程序和資料表搭配,建立一張表和建立預存程序,預存程序負責產生訂單號,表負責處理唯一性問題
SQL server高並發生成唯一訂單號
當預存程序產生訂單編號,先把訂單號碼寫進表中,再把訂單號碼結果顯示出來,把產生的訂單號碼寫進表裡會出現兩種狀況,為什麼呢?因為我們的表設定了主鍵(主鍵唯一性)

  • 能寫進:  當表裡沒有相同的訂單號,也就是把產生的訂單號寫進表裡

  • 不能寫進:當表裡存在相同的訂單號,即生成的訂單號無法寫到表裡,也就不能獲取到訂單號,從而確保高並發下生成唯一訂單號

三、高並發情況下產生唯一訂單號碼的流程

以下將用程式碼和實際操作講解下產生唯一訂單號碼的流程
第一步:建立一張資料表,設定訂單號碼欄位為主鍵(唯一訂單號碼的關鍵)
SQL server高並發生成唯一訂單號
#第二步:建立產生訂編號的預存程序
產生訂單編號格式為:自訂前綴年月日後綴(001、002、003)
1.先建立一個預存程序
參數為@BILL_TYPE

CREATE  PROCEDURE [dbo].[GetBillNO]
 @BILL_TYPE nvarchar(3)
登入後複製

2.產生年月日和後綴
年月日為目前系統時間,後綴初始值為0

declare @BILL_NO nvarchar(15);declare @currentDate nvarchar(15);declare @lastno INT = 0;set @currentDate = Convert(varchar(10),Getdate(),112);
登入後複製

3.查詢表格,取得表格的訂單編號
查詢表格,取得前綴與自訂內容相關的最新訂單編號並賦值給@BILL_NO

select @BILL_NO = isnull(BILL_NO,0)
    FROM temp_bill 
    WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and
    SUBSTRING(BILL_NO,4,8) =@currentDate
登入後複製

4.產生訂單編號

  • 如果上一步驟取得的訂單編號不為空,新產生的訂單號碼在原訂單號碼上1

    範例:取得的訂單編號:QNB20200615015
    即產生的訂單號碼為:QNB20200615016

  • #如果上一步取得的訂單號碼為空,新產生的訂單號碼後綴為001

    #範例:產生的訂單編號:QNB20200615001

IF @BILL_NO !='' begin
 SET @lastno = str(right(@BILL_NO, 3)+1) ; 
 set @BILL_NO = @BILL_TYPE+@currentDate+RIGHT('000'+CAST(@lastno as varchar),3);
 end;ELSE  begin
 set @BILL_NO = @BILL_TYPE+@currentDate+CAST('001' as varchar(20));END;
登入後複製

在做這裡的時候由於SQL server沒有LPAD函數(不足規定位數自動補齊),所以用了字串拼接,再用right去取得右邊3位達到目的(¯﹃¯ ),枯了

5.將產生的訂單號插入表中
如果表中存在相同訂單號則插入表失敗
如果表中不存在相同訂單號碼則插入表成功

insert into Temp_Bill(BILL_NO,BILL_TYPE) values(@BILL_NO ,@BILL_TYPE )
登入後複製

6.傳回唯一訂單編號
當訂單插入表成功,即可傳回唯一的訂單編號(如果上一步不成功,即不會運行這一步)

select @BILL_NO as BILL_NO
登入後複製

四、運行結果

#1.首先我的表裡沒有數據,會產生前綴(我輸入的:UIE) 年月日(20200615) 001(第一個數據,所以是001)
即:QNB20200615001

2當我第二次輸入時,由於表裡有數據了,會根據最新的訂單編號字尾加1
即:QNB20200615002
SQL server高並發生成唯一訂單號

五、老規矩

希望這篇文章可以幫到大家
積分充足的就直接下載吧,沒有積分的對著圖敲,反正代碼量也不大
如果你是學生,沒有積分,可以私聊我,免費給你發源碼
代碼下載連結:SQL server_getbillno.bak
程式碼截圖:
SQL server高並發生成唯一訂單號

#

以上是SQL server高並發生成唯一訂單號的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板