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

推荐订阅源

Engineering at Meta
Engineering at Meta
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
博客园_首页
T
Tailwind CSS Blog
美团技术团队
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
InfoQ
MongoDB | Blog
MongoDB | Blog
The Cloudflare Blog
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
Blog — PlanetScale
Blog — PlanetScale
IT之家
IT之家
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog

博客园 - 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