周一至周五 : 08:30 - 17:30 客服专员电话/微信:18049989370 QQ:857188287
微信咨询

扫码微信咨询

关注公众号

关注微信公众号

电话: 021 5161 9370
返回顶部
生成唯一码的SQLServer自定义函数(2)
显示全部楼层 倒序浏览 发表日期 2026-04-02 15:39:06 36次阅读 0次回复


更新了一个版本,在实际生产环境下更具实用性。
1、年份 (1位):设定一个基准年份(如 2025年 为 0,2026 为 1 ... 到 2034 为 9, 2035 为 A等)。1个字符可表示 36 年。
2、月份 (1位):1-9月用 1-9,10-12月用 A, B, C。
3、日期 (1位):1-9日用 1-9,10-31日用 A-V。
4、时 (1位):1点起为 A,B,C...23点为 W,0点为 X
5、分秒 (4位):保留2位分和2位秒,便于排查。
6、两位批次码,每次查询固定随机两位字母。
7、6位序列值。小于100万按数值序列生成。大于等于100万时,用3位字母3位序号,从AAA001开始.....AAA999、AAB000.....

  1. CREATE   FUNCTION [dbo].[ShortSeq](
  2.     @SeqNum INT               -- 即时动态分配的十进制行号
  3. )
  4. RETURNS VARCHAR(50)
  5. AS
  6. BEGIN
  7.     DECLARE @Now DATETIME2 = SYSDATETIME();
  8.     DECLARE @ShortSeq VARCHAR(16);
  9.    
  10.     -- 【批次防异动绝对隔离】(事务 ID 锁定法则)
  11.     -- 获取当前事务 ID。无论是 BEGIN TRAN 显示启动还是 INSERT...SELECT 隐式发起的修改,此 ID 拥有执行全生命周期唯一的常量态。
  12.     DECLARE @TxnID BIGINT = CURRENT_TRANSACTION_ID();
  13.    
  14.     -- 如果是在没有修改意图的单纯 SELECT 预览测试下,@TxnID 可能为空,此时平滑回退至分钟级快照进行兜底。
  15.     DECLARE @BatchKey VARCHAR(50) = CAST(@@SPID AS VARCHAR(10)) + '_' +
  16.         ISNULL(CAST(@TxnID AS VARCHAR(20)), CONVERT(VARCHAR(16), @Now, 120));
  17.         
  18.     DECLARE @Chk INT = ABS(CHECKSUM(@BatchKey));
  19.     DECLARE @RandChar1 CHAR(1) = CHAR(65 + (@Chk % 26));           
  20.     DECLARE @RandChar2 CHAR(1) = CHAR(65 + ((@Chk / 26) % 26));   
  21.    
  22.     -- 【时间部分提取】(8位)
  23.     DECLARE @Y INT = YEAR(@Now) - 2025;
  24.     DECLARE @M INT = MONTH(@Now);
  25.     DECLARE @D INT = DAY(@Now);
  26.     DECLARE @H INT = DATEPART(HOUR, @Now);
  27.    
  28.     -- 【拼接 16 位短码 (CPU 零交互损耗算法)】
  29.     SET @ShortSeq =
  30.         -- 1. 年月日时 (4位)
  31.         CHAR(CASE WHEN @Y < 10 THEN 48 + @Y ELSE 55 + @Y END) +
  32.         CHAR(CASE WHEN @M < 10 THEN 48 + @M ELSE 55 + @M END) +
  33.         CHAR(CASE WHEN @D <= 26 THEN 64 + @D ELSE 22 + @D END) +
  34.         CHAR(CASE WHEN @H = 0 THEN 88 ELSE 64 + @H END) +
  35.         
  36.         -- 2. 分秒细节保留 (4位)
  37.         RIGHT('0' + CAST(DATEPART(MINUTE, @Now) AS VARCHAR(2)), 2) +
  38.         RIGHT('0' + CAST(DATEPART(SECOND, @Now) AS VARCHAR(2)), 2) +
  39.         
  40.         -- 3. 严格受事务基准锁定的批次随机字母 (2位)
  41.         @RandChar1 + @RandChar2 +
  42.         
  43.         -- 4. 混合溢出序列生成 (6位定长)
  44.         CASE
  45.             WHEN @SeqNum <= 999999 THEN
  46.                 -- 正常容载:直白可读的补零纯数字
  47.                 RIGHT('000000' + CAST(@SeqNum AS VARCHAR(6)), 6)
  48.             ELSE
  49.                 -- 千万级洪载:进位转行 3字母+3数字 (如 BMM001)
  50.                 CHAR(65 + (((@SeqNum - 1000000) / 1000 / 676) % 26)) +   
  51.                 CHAR(65 + (((@SeqNum - 1000000) / 1000 / 26) % 26)) +   
  52.                 CHAR(65 + (((@SeqNum - 1000000) / 1000) % 26)) +         
  53.                 RIGHT('000' + CAST(((@SeqNum - 1000000) % 1000) AS VARCHAR(3)), 3)
  54.         END;
  55.         
  56.     RETURN @ShortSeq;
  57. END
复制代码


执行使用
  1. SELECT dbo.ShortSeq(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)))
复制代码



结果

  1. 14BO3624CZ000001
复制代码




技术维度与解决方案落地优势
极速性能:彻底摒弃了复杂的哈希或加密函数,全程使用原生只读变量与基础位运算,CPU 损耗趋近于零。
绝对防重:挖掘并利用了 SQL Server 内核级 CURRENT_TRANSACTION_ID(),搭配会话隔离,从底层切断并发碰撞可能。
海量扩容:首创平滑跃迁混合序列(纯数字无缝衔接字母数字组合),单次生成上限暴冲至 1,857万行。
排障友好:严格维持 16 位极简定长。常规百万级以内的业务呈现纯数字序列,人工溯源追踪体验极佳。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则  允许回帖邮件提醒楼主

快表软件是国内较早研究表格类软件开发平台的团队之一,迄今已有十多年的行业经验.致力于为企事业单位提供实用可靠的数字化平台。
  • 微信公众号

  • 微信小商店

  • 微信客服

  • Powered by Discuz! X3.4 | Copyright © 2022-2024, XiRong Soft. | 快表软件
  • 沪ICP备13033196号 | 营业执照 |上海西戎软件科技有限公司|沪公网安备31011502002146号|沪ICP备13033196号 |