千家信息网

SQL server高并发生成唯一订单号的案例

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关SQL server高并发生成唯一订单号的案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、场景再现在一个erp进销存系统或0A等其他系统中,
千家信息网最后更新 2026年11月02日SQL server高并发生成唯一订单号的案例

这篇文章给大家分享的是有关SQL server高并发生成唯一订单号的案例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、场景再现

在一个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高并发生成唯一订单号的案例"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

订单 订单号 生成 过程 表里 存储 后缀 数据 相同 代码 年月 年月日 情况 成功 内容 前缀 积分 篇文章 系统 表格 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 智能科技公司是互联网公司吗 互联网络科技有限公司 华中科技大学互联网 电子科技大学互联网 长亮科技互联网金融 互联网科技类展会 甘肃拓世互联网科技有限公司 互联网实体化科技化 宁波青枫互联网科技有限公司 中国互联网有什么科技含量 厦门比较好的科技互联网公司 上海宁丞科技互联网 苏州铭阳互联网科技有限公司 企晟互联网信息科技有限公司 为客找房互联网科技公司怎么样 互联网时代的科技公司 宇信科技在杭州互联网排第几 互联网科技的前景 亚光科技低轨卫星互联网 河南云网互联网络科技有限公司 互联网金融与金融科技 四川狮子座互联网科技 互联网科技英文翻译 栖莱科技互联网股份有限公司 互联网和黑科技的看法 互联网公司黑科技创始人 陕西云淼互联网科技公司 互联网科技手抄报图片 互联网科技收购价值
0