惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
有赞技术团队
有赞技术团队
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
博客园 - 【当耐特】
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
The Cloudflare Blog
Microsoft Azure Blog
Microsoft Azure Blog
腾讯CDC
Vercel News
Vercel News
IT之家
IT之家
MyScale Blog
MyScale Blog
博客园_首页
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
罗磊的独立博客

博客园 - Shapley

项目心得 进程间通讯方式 C#使用MCP协议调用大模型示例 SQL Server LEAD函数实践 sql server行专列一例 数据库字段排序方法两则 审批流进化记 winform+Task+async 献丑贴:Task.Run中foreach优化 Sql Server Begin TRY sample No service for type 'Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.ValidateAntiforgeryTokenAuthorizationFilter' has been registered. 某低代码平台自定义控件技术点 Element-plus的el-date-picker控件动态切换中英文方案 Chrome浏览器无法查看页面跳转前的请求日志及解决办法 element-plus上传视频并生成缩略图(封面)方案 JWT自动刷新草案 Ajax方法POST的两种提交方式 H5项目在微信浏览器运行实录 Sql Server变量声明及使用技巧 修改Dify的Nginx对外访问端口 Task with Console(with SemaphoreSlim) Task实战 asp.net core 9.0发布centos7.9 Barrier CountdownEvent
Sql Server生成ULID例子
Shapley · 2026-04-14 · via 博客园 - Shapley
ALTER FUNCTION [dbo].[ulidStr] ()
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @temp BINARY (16)

    SET @temp = CAST(dbo.ulid() AS BINARY (16))

    RETURN [dbo].[base32CrockfordEnc](SUBSTRING(@temp, 11, 6) + SUBSTRING(@temp, 1, 10), 0)
END
/****** Object:  UserDefinedFunction [dbo].[base32CrockfordEnc]    Script Date: 2026/4/14 15:25:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER FUNCTION [dbo].[base32CrockfordEnc] (
    @x VARBINARY(max)
    ,@pad INT = 1
    )
RETURNS VARCHAR(max)
AS
BEGIN
    /* modified BASE32 encoding as definied by Crockford at http://www.crockford.com/wrmg/base32.html */
    DECLARE @p INT
    DECLARE @c BIGINT
    DECLARE @s BIGINT
    DECLARE @q BIGINT
    DECLARE @t BIGINT
    DECLARE @o VARCHAR(max)
    DECLARE @op VARCHAR(8)
    DECLARE @alpha CHAR(32)

    SET @alpha = '0123456789ABCDEFGHJKMNPQRSTVWXYZ'
    SET @o = ''
    SET @p = DATALENGTH(@x) % 5 --encode with 40-bit blocks

    IF @p <> 0
        SET @x = @x + SUBSTRING(0x0000000000, 1, 5 - @p)
    SET @c = 0

    WHILE @c < DATALENGTH(@x)
    BEGIN
        SET @s = 0
        SET @t = CAST(SUBSTRING(@x, @c + 1, 5) AS BIGINT)
        SET @op = ''

        WHILE @s < 8
        BEGIN
            SET @q = @t % 32
            SET @op = SUBSTRING(@alpha, @q + 1, 1) + @op
            SET @t = @t / 32
            SET @s = @s + 1
        END

        SET @o = @o + @op
        SET @c = @c + 5
    END

    DECLARE @padc CHAR(1)

    --padding section
    SET @padc = CASE 
            WHEN @pad IS NULL
                OR @pad = 1
                THEN '='
            ELSE ''
            END
    SET @o = CASE 
            WHEN @p = 1
                THEN SUBSTRING(@o, 1, DATALENGTH(@o) - 6) + REPLICATE(@padc, 6)
            WHEN @p = 2
                THEN SUBSTRING(@o, 1, DATALENGTH(@o) - 4) + REPLICATE(@padc, 4)
            WHEN @p = 3
                THEN SUBSTRING(@o, 1, DATALENGTH(@o) - 3) + REPLICATE(@padc, 3)
            WHEN @p = 4
                THEN SUBSTRING(@o, 1, DATALENGTH(@o) - 1) + REPLICATE(@padc, 1)
            ELSE @o
            END

    RETURN LTRIM(RTRIM(@o))
END
ALTER FUNCTION [dbo].[ulid] ()
RETURNS UNIQUEIDENTIFIER
AS
BEGIN
    DECLARE @rnd BINARY (10)
    DECLARE @dt DATETIME2
    DECLARE @di BIGINT

    SELECT TOP 1 @dt = dt
        ,@rnd = rnd
    FROM dbo.ulid_view

    SET @di = DATEDIFF(hour, CAST('1970-01-01 00:00:00' AS DATETIME2), @dt)
    SET @di = (@di * 60) + DATEPART(minute, @dt)
    SET @di = (@di * 60) + DATEPART(second, @dt)
    SET @di = (@di * 1000) + DATEPART(ms, @dt)

    RETURN CAST(@rnd + SUBSTRING(CAST(@di AS BINARY (8)), 3, 6) AS UNIQUEIDENTIFIER)
END
CREATE VIEW [dbo].[ulid_view]
AS
SELECT SYSUTCDATETIME() AS dt
    ,CRYPT_GEN_RANDOM(10) AS rnd

GO