SQlSERVER生成唯一编号

基数表-用来存储编号前缀和类型

建表如下

CREATE TABLE [dbo].[SerialNo](
[sCode] [varchar](50) NOT NULL,
[sName] [varchar](100) NULL,
[sQZ] [varchar](50) NULL,
[sValue] [varchar](80) NULL,
CONSTRAINT [PK_SerialNo] PRIMARY KEY CLUSTERED
(
[sCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

这个表需要手动添加你的前缀

例如:

存储过程代码:

 1 Create procedure [dbo].[GetSerialNo]
 2 (
 3    @sCode varchar(50)
 4 )
 5
 6   as
 7
 8 --exec GetSerialNo
 9
10 begin
11
12    Declare @sValue  varchar(16),
13
14            @dToday   datetime,
15
16            @sQZ  varchar(50)  --这个代表前缀
17
18    Begin Tran
19
20    Begin Try
21
22      -- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
23     --在同一个事物中,执行了update语句之后就会启动锁
24      Update SerialNo set sValue=sValue where sCode=@sCode
25
26      Select @sValue = sValue From SerialNo where sCode=@sCode
27
28      Select @sQZ = sQZ From SerialNo where sCode=@sCode
29
30     -- 因子表中没有记录,插入初始值--基数据必须手动去创建
31
32     If @sValue is null
33
34      Begin
35
36        Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + ‘000001‘)
37
38        Update SerialNo set sValue=@sValue where sCode=@sCode
39
40      end
41
42    else
43
44      Begin               --因子表有记录
45
46        Select @dToday = substring(@sValue,1,6)
47
48       --如果日期相等,则加1
49
50        If @dToday = convert(varchar(6), getdate(), 12)
51
52          Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))
53
54       else              --如果日期不相等,则先赋值日期,流水号从1开始
55
56         Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +‘000001‘)
57
58
59
60        Update SerialNo set sValue =@sValue where sCode=@sCode
61
62      End
63
64      Select result = @sQZ+@sValue
65
66      Commit Tran
67
68    End Try
69
70    Begin Catch
71
72      Rollback Tran
73
74      Select result = ‘Error‘
75
76    End Catch
77
78 end 

执行:exec dbo.GetSerialNo ‘CUS‘

结果:CUS150413000001

此方法可用作生成流水号,使用update启动数据库锁,并发不会重复,可读性比较好,当然使用GUID就另当别论了。

时间: 2024-10-11 23:10:21

SQlSERVER生成唯一编号的相关文章

PHP生成唯一编号 36进制不重复编号

PHP实现生成唯一编号,文中使用10进制转换36进制得到不重复的6000多万个唯一编号,编号位数为10位. 当要将一个庞大的数据进行编号时,而编号有位数限制,比如5位的车牌号.10位的某证件号码.订单流水号.短网址等等,我们可以使用36进制计算出符合位数的不重复的编号.我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35.这样的话我要得到一个5位的编号,最大信息量就是36的5次方了,36^5 = 60466176,即最大的

Java秒杀系统实战系列~分布式唯一ID生成订单编号

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第七篇,在本博文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的"分布式唯一ID生成算法-雪花算法"来实现. 内容: 在上一篇博文,我们完成了商品秒杀业务逻辑的代码实战,在该代码中,我们还实现了"当用户秒杀成功后,需要在数据库表中为其生成一笔秒杀成功的订单记录&qu

如何生成唯一且不可预测的 ID

通常数据库可以生成唯一的 ID,最多的就是数字序列,也有像 MongoDB 这样产生组合序列的,不过这种形式的 ID 由于是序列,是可以预测的.如果想得到不可预测且唯一的 ID,方法还是有的. 下面主要以 Node.js 的环境为例. Node-uuid Github 上有个 node-uuid 项目,它可以快速地生成符合 RFC4122 规范 version 1 或者 version 4 的 UUID. 安装,既可以通过 npm install node-uuid ,也可以在 package.

按规则自动生成单据编号 以及并发问题

描述:每种单据新建时,自动生成它的单据编号. 规则如:固定码+日期+流水号 (ABC1603180001) 方法一:触发器 触发器的缺点是,执行了sql之后才看到编码. 测试:流水号不能超过最大数,否则后面的号码全是0 --有两张表,客户表和项目表,要求:新建项目时自动生成项目编号,每个不同的客户的项目的编号从1开始 --项目编号格式为PJ+"-"+"客户编号"+"-"+"日期"+"-"+"流水号

java 二叉树的遍历 为什么只给出前序以及后序遍历,不能生成唯一的二叉树

最近在学习java的数据结构与算法知识,看到数据结构 树的遍历的方式.在理解过程中.查看到一篇文章,视野非常有深度,在信息论的角度看待这个问题.在此贴出该文章的链接以及内容. [文章出处]http://www.binarythink.net/2012/12/binary-tree-info-theory/ 我们在学习二叉树的遍历时,都会不可避免的学到二叉树的三种遍历方式,分别是遵循(根-左-右)的前序遍历.遵循(左-根-右)的中序遍历以及遵循(左-右-根)的后序遍历.并且每一个二叉树都可以用这三

PHP 生成唯一的激活码

<?php /** * 生成永远唯一的激活码 * @return string */ function create_guid($namespace = null) { static $guid = ''; $uid = uniqid ( "", true ); $data = $namespace; $data .= $_SERVER ['REQUEST_TIME']; // 请求那一刻的时间戳 $data .= $_SERVER ['HTTP_USER_AGENT']; //

【Python】 uuid生成唯一ID

uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identifier).python中自带了uuid模块来进行uuid的生成和管理工作.(具体从哪个版本开始有的不清楚..) python中的uuid模块基于信息如MAC地址.时间戳.命名空间.随机数.伪随机数来uuid.具体方法有如下几个: uuid.uuid1() 基于MAC地址,时间戳,随机数来生成唯一的u

php生成唯一订单号

支持更改长度/** * 生成唯一订单号 * */ function build_order_no(){ return date('Ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); }

.Net常用技巧_生成物料编号(根据分类代码生成)

这个是自己用的,不一定符合您的需求. using System; using System.Collections.Generic; using System.Text; using EXDataControl; using System.Data; using System.Data.SqlClient; using Utility; namespace MyTool { public class CreateMaterialCode { /// <summary> /// 获取新物料编号(