当前位置:Gxlcms >
数据库问题 >
简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
时间:2021-07-01 10:21:17
帮助过:3人阅读
@Prefix nvarchar(
32)
=‘C‘ --输入前缀
DECLARE @Qty int=1 --输入增长步长
SET TRANSACTION ISOLATION LEVEL READ COMMITTED --设置隔离级别
BEGIN TRAN --开启事务
DECLARE @maxNum bigint=0 --声明目前指定前缀的当前最大数字
reTry:
--goto的label
SELECT
@maxNum = MaxNum
+ @Qty
FROM Increments
WITH (UPDLOCK)
WHERE Prefix
= @Prefix --使用更新锁查询指定前缀的目前种子数+步长,并发时,如果存在记录,只有一个连接可以查询到此记录,其他连接会被阻塞至事务提交后
IF (
@maxNum = 0)
--如果未查到此前缀
BEGIN
BEGIN TRY
SET @maxNum = @maxNum + @Qty
INSERT Increments
VALUES (
@Prefix,
@maxNum)
--插入前缀记录,设置目前种子数等于步长,并发情况下同样的前缀可能会同时会执行插入操作,通过在Prefix设置唯一索引使只有一个插入成功,其他重新reTry
END TRY
BEGIN CATCH
GOTO reTry
--插入失败时reTry
END CATCH
END
ELSE
BEGIN
UPDATE Increments
SET MaxNum
= MaxNum
+ @Qty
WHERE Prefix
= @Prefix --查到种子数的情况下,更新记录
END
SELECT
@maxNum --返回目前种子数+步长的结果
COMMIT
订单号:短日期作为前缀+随机(1-9)步长+随机数字,如
20180108 00016 037 --示例,正常情况中间没有空格
20180108 00019 233
券码:批量生成10w张,单字母作为前缀(如T),步长设置为100W,获取数字(如2000000),生成1000000-2000000的数组,通过洗牌算法获取10w个元素,将每个元素转换为36进制
如
TSM9H --对应T1335221
TSMC9 --对应T1335321
然后类似身份证校验码,自己设计一个算法增加1-2位校验码在开始或者结束,如所有数字*自身相加取最后一位放在最后,例
--T转换为数字为29
TSM9H8 --对应TSM9H 2*2+9*9+1*1+3*3+3*3+5*5+2*2+2*2+1*1=138
TSMC93 --对应TSMC9 2*2+9*9+1*1+3*3+3*3+5*5+3*3+2*2+1*1=143
简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
标签:bsp 日期 输入 begin 存储 校验 脚本 nbsp 没有