前言
前幾天寫了一篇MySQL高並發生成唯一訂單號碼的方法,有人私訊問有沒有SQL server版本的,今天中午特地寫了SQL server版本的高並發生成唯一訂單號實現,其實MySQL和SQL server原理都一樣,主要是他們部分文法有些區別,所以你會發現我這篇文章文字說明幾乎一樣,只有程式碼和介面不一樣。
推薦:《SQL教學》
一、場景再現
在一個erp進銷存系統或0A等其他系統中,如果多人同時進行產生訂單號碼的操作的話,容易出現多人獲得同一個訂單號的情況,對公司業務造成不可挽回的損失
二、如何避免高並發情況訂單號不唯一
我們可以利用預存程序和資料表搭配,建立一張表和建立預存程序,預存程序負責產生訂單號,表負責處理唯一性問題
當預存程序產生訂單編號,先把訂單號碼寫進表中,再把訂單號碼結果顯示出來,把產生的訂單號碼寫進表裡會出現兩種狀況,為什麼呢?因為我們的表設定了主鍵(主鍵唯一性)
-
能寫進: 當表裡沒有相同的訂單號,也就是把產生的訂單號寫進表裡
不能寫進:當表裡存在相同的訂單號,即生成的訂單號無法寫到表裡,也就不能獲取到訂單號,從而確保高並發下生成唯一訂單號
三、高並發情況下產生唯一訂單號碼的流程
以下將用程式碼和實際操作講解下產生唯一訂單號碼的流程
第一步:建立一張資料表,設定訂單號碼欄位為主鍵(唯一訂單號碼的關鍵)
#第二步:建立產生訂編號的預存程序
產生訂單編號格式為:自訂前綴年月日後綴(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_getbillno.bak
程式碼截圖:
以上是SQL server高並發生成唯一訂單號的詳細內容。更多資訊請關注PHP中文網其他相關文章!

SQL的高級查詢技巧包括子查詢、窗口函數、CTE和復雜JOIN,能夠處理複雜數據分析需求。 1)子查詢用於找出每個部門工資最高的員工。 2)窗口函數和CTE用於分析員工的薪資增長趨勢。 3)性能優化策略包括索引優化、查詢重寫和使用分區表。

MySQL是開源的關係型數據庫管理系統,提供了標準SQL功能和擴展。 1)MySQL支持標準SQL操作如CREATE、INSERT、UPDATE、DELETE,並擴展了LIMIT子句。 2)它使用InnoDB和MyISAM等存儲引擎,適用於不同場景。 3)用戶可以通過創建表、插入數據和使用存儲過程等高級功能高效使用MySQL。

sqlmakesdatamanagectAccessibletoAllbyProvidingAsimpleyetpoperfultoolSetSetForQuerquereingAndManagingDatabases.1)ItworkswithrelationalDatabases,允許inserstospecefifywhattheywanttododowithththedata.2)

SQL索引可以通过巧妙的设计显著提升查询性能。1.选择合适的索引类型,如B-tree、哈希或全文索引。2.使用复合索引优化多字段查询。3.避免过度索引以减少数据维护开销。4.定期维护索引,包括重建和移除不必要的索引。

在 SQL 中刪除約束,請執行以下步驟:識別要刪除的約束名稱;使用 ALTER TABLE 語句:ALTER TABLE 表名 DROP CONSTRAINT 約束名;確認刪除。

SQL 觸發器是一種在指定表上執行特定事件時自動執行特定操作的數據庫對象。要設置 SQL 觸發器,可以使用 CREATE TRIGGER 語句,其中包括觸發器名稱、表名稱、事件類型和触發器代碼。觸發器代碼使用 AS 關鍵字進行定義,並包含 SQL 或 PL/SQL 語句或塊。通過指定觸發器條件,可以使用 WHERE 子句限制觸發器的執行範圍。可以使用 INSERT INTO、UPDATE 或 DELETE 語句在觸發器代碼中執行觸發器操作。 NEW 和 OLD 關鍵字可以在觸發器代碼中用來引用受影

索引是一種通過排序數據列來加速數據查找的數據結構。為 SQL 查詢添加索引的步驟如下:確定需要索引的列。選擇合適的索引類型(B 樹、哈希或位圖)。使用 CREATE INDEX 命令創建索引。定期重建或重新組織索引以維護其效率。添加索引的好處包括提高查詢性能、減少 I/O 操作、優化排序和篩選以及提高並發性。當查詢經常使用特定列、返回大量數據需要排序或分組、涉及多個表或數據庫表較大時,應該考慮添加索引。

IFELSE 語句是一種條件語句,用於根據條件評估結果返回不同值。其語法結構為:IF (condition) THEN return_value_if_condition_is_true ELSE return_value_if_condition_is_false END IF;。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能