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

扫码微信咨询

关注公众号

关注微信公众号

电话: 021 5161 9370
返回顶部
生成唯一码的SQLServer自定义函数
显示全部楼层 倒序浏览 发表日期 2026-03-31 12:00:16 41次阅读 0次回复
本帖最后由 快表帝国客服01 于 2026-4-2 15:39 编辑

在通常情况下,我们使用快表自动编号以及GUID全球唯一码实现业务场景中的唯一编码要求,而在一些特定的场合下,需要兼顾唯一性、可读性与便捷性的原则来生成唯一编码。下面分享一个千万级数据不重复的编码方案。编码采用年月日时分秒加随机码的方式产生,可以实现在生成1000万行数据0重复。其中年月日时分秒通过定长字母加数字base36的映射方案实现:

更新的版本见:http://bbs.kuaibiao.cn/thread-6002-1-1.html


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、极强防重哈希 (10位):截取 MD5 转换的高精 16 进制码。

  1. CREATE   FUNCTION [dbo].[ShortCode](
  2.     @Str VARCHAR(50)  
  3. )
  4. RETURNS VARCHAR(50)
  5. AS
  6. BEGIN
  7.     -- 1. 使用高精度时间
  8.     DECLARE @Now DATETIME2 = SYSDATETIME();
  9.     DECLARE @ShortCode VARCHAR(50);
  10.     DECLARE @Hash VARBINARY(16);
  11.    
  12.     -- 2. 使用 MD5 生成防重哈希
  13.     SET @Hash = HASHBYTES('MD5',
  14.         CONVERT(VARCHAR(27), @Now, 121) +
  15.         CAST(@@SPID AS VARCHAR(10)) +
  16.         CAST(ISNULL(@Str, '') AS VARCHAR(50))
  17.     );
  18.    
  19.     -- 3. 提取各个时间部分
  20.     DECLARE @Y INT = YEAR(@Now) - 2025; -- 基准 2025年=0
  21.     DECLARE @M INT = MONTH(@Now);
  22.     DECLARE @D INT = DAY(@Now);
  23.     DECLARE @H INT = DATEPART(HOUR, @Now);
  24.    
  25.     -- 4. 组装极简易读且高防重唯一的 16 位短码
  26.     SET @ShortCode =
  27.         -- 【年】 1位 (0-9, A-Z)
  28.         CHAR(CASE WHEN @Y < 10 THEN 48 + @Y ELSE 55 + @Y END) +
  29.         
  30.         -- 【月】 1位 (1-9, A-C)
  31.         CHAR(CASE WHEN @M < 10 THEN 48 + @M ELSE 55 + @M END) +
  32.         
  33.         -- 【日】 1位 (1-26 用 A-Z, 27-31 用 1-5)
  34.         CHAR(CASE WHEN @D <= 26 THEN 64 + @D ELSE 22 + @D END) +
  35.         
  36.         -- 【时】 1位 (1点起为 A,B,C...23点为 W,0点为 X)
  37.         CHAR(CASE WHEN @H = 0 THEN 88 ELSE 64 + @H END) +
  38.         
  39.         -- 【分与秒保留】 直观明了(4位)
  40.         RIGHT('0' + CAST(DATEPART(MINUTE, @Now) AS VARCHAR(2)), 2) +
  41.         RIGHT('0' + CAST(DATEPART(SECOND, @Now) AS VARCHAR(2)), 2) +
  42.         
  43.         -- 【防重哈希】 10位 (保留底层最高效的二进制转16进制,天然数字与字母混合)
  44.         CONVERT(VARCHAR(10), SUBSTRING(@Hash, 1, 5), 2);
  45.         
  46.     RETURN @ShortCode;
  47. END
复制代码



运行:
  1. SELECT  dbo.ShortCode(NewID())
复制代码


效果:
  1. 135K581347ED915A9D
复制代码
上面结果为2026年3月31日11点58分13秒 后面加10位哈希值

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

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

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

  • 微信小商店

  • 微信客服

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