SQlSERVER生成唯一编号

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: SQlSERVER生成唯一编号

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]

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

例如:image.png

存储过程代码:

Create procedure [dbo].[GetSerialNo]
(
   @sCode varchar(50)
)
  as
--exec GetSerialNo
begin
   Declare @sValue  varchar(16),
           @dToday   datetime,
           @sQZ  varchar(50)  --这个代表前缀
   Begin Tran
   Begin Try
     -- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
    --在同一个事物中,执行了update语句之后就会启动锁
     Update SerialNo set sValue=sValue where sCode=@sCode
     Select @sValue = sValue From SerialNo where sCode=@sCode
     Select @sQZ = sQZ From SerialNo where sCode=@sCode
    -- 因子表中没有记录,插入初始值--基数据必须手动去创建
    If @sValue is null
     Begin
       Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001')
       Update SerialNo set sValue=@sValue where sCode=@sCode
     end
   else
     Begin               --因子表有记录
       Select @dToday = substring(@sValue,1,6)
      --如果日期相等,则加1
       If @dToday = convert(varchar(6), getdate(), 12)
         Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))
      else              --如果日期不相等,则先赋值日期,流水号从1开始
        Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001')
       Update SerialNo set sValue =@sValue where sCode=@sCode
     End
     Select result = @sQZ+@sValue
     Commit Tran
   End Try
   Begin Catch
     Rollback Tran
     Select result = 'Error'
   End Catch
end

执行:exec dbo.GetSerialNo 'CUS'

结果:CUS150413000001

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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
存储 SQL 程序员
【Sql Server】存储过程通过作业定时执行按天统计记录
通过前两篇文章的学习,我们已经对创建表、存储过程、作业等功能点有所了解 本次将结合前面所学习的知识点,创建统计表以及结合作业定时按天以及实时统计域名各个长度的记录值
399 0
【Sql Server】存储过程通过作业定时执行按天统计记录
|
存储 SQL 数据库
SQL Server——为什么要使用存储过程?不使用是什么样的?
提高数据库执行速度,可能第一次见到这句话的小伙伴们感觉到非常的匪夷所思叭!怎么就提高了它的执行速度捏,从哪方面可以表现出来呢?既然这里要说到的是为什么要使用存储过程,也就是说它的优点是什么。那我们肯定就要对使用和不使用存储过程两方面来进行对比才能看出它的优点对吧。
|
存储 SQL Go
SQL Server 存储过程
SQL Server 存储过程
156 0
|
SQL 存储 数据可视化
【Sql Server】存储过程通过定时执行添加记录作业
通过上篇了解了什么是存储过程,创建存储过程的方法,以及调用存储过程的方法 本次将通过数据库中的作业功能,进行定时执行存储过程,这样就可以完成我们刚开始假设的场景
541 0
|
SQL 存储 安全
【Sql Server】存储过程的创建和调用,随机添加域名记录
假设有这样一个场景 创建一个储存过程A,它执行添加一条随机产生3到8位长度的域名记录,通过定时器T1每隔1秒执行一次存储过程A 创建另一个存储过程B,它执行统计域名的长度3到8的记录数,通过定时器T2每隔1秒执行一次存储过程B
198 0
【Sql Server】存储过程的创建和调用,随机添加域名记录
|
存储 SQL 安全
SQL Server——SQL Server存储过程与exec简单使用
SQL Server——SQL Server存储过程与exec简单使用
722 0
|
存储 SQL Go
SQL Server存储过程详细介绍(二)
存储过程其实就是已预编译为可执行过程的一个或多个SQL语句。 通过调用和传递参数即可完成该存储过程的功能。 前面有介绍过存储过程的一些语法,但是没有详细示例,今天我们来一起研究一下存储过程。
SQL Server存储过程详细介绍(二)
|
存储 SQL 缓存
SQL Server存储过程详细介绍(一)
存储过程其实就是已预编译为可执行过程的一个或多个SQL语句。 通过调用和传递参数即可完成该存储过程的功能。 前面有介绍过存储过程的一些语法,但是没有详细示例,今天我们来一起研究一下存储过程。
|
存储 SQL Go
SQL Server存储过程总结
存储过程简介: 存储过程(Stored Procedure)是在大型数据库中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升 ​ ------来源于百度百科 存储过程的种类: 1系统存储过程 以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。 2本地存储过程 用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。
237 0