1
0
mirror of synced 2025-12-08 14:18:13 +08:00
Files
SnowFlake-IdGenerator/SQL/sqlserver.sql
2021-04-18 01:28:52 +08:00

57 lines
1.9 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
设计说明:
1.这是SQL Server的一个内置方法运行此脚本后将在SQL Server的“可编程性-函数-标量值函数”中增加一个方法 Fn_NextSnowId
2.生成的ID = 时间差 + WokerId + 随机数
时间差 = 当前时间戳(毫秒单位) - 1582136402000
WorkerId = {配置值}
随机数 = 5 至 2^SeqBigLength-1 之间的整数
3.调用方法:
例如select dbo.Fn_NextSnowId(rand())
说明:必须带 dbo. 前缀
4.自动赋值:
如果主键设置为雪花ID类型bigint可以将该主键的 “默认值或绑定” 设置为 ([dbo].[Fn_NextSnowId](rand()))以便在Insert记录时能给主键自动赋值而无需外部传入。
*/
-- 先删除函数
if exists(select * from sys.objects where name='Fn_NextSnowId')
drop function dbo.Fn_NextSnowId;
Go
-- 再创建函数
CREATE function dbo.Fn_NextSnowId
(
@RandomSeed float -- 生成ID的函数需要有一个随机数在调用时传入系统函数 rand() 即可
)
returns bigint
as
begin
declare @CurrentTime bigint
declare @TimeTick bigint
declare @WorkerId int
declare @WorkerIdBigLength int
declare @SeqBigLength int
-- Begin: 以下是需要初始化的参数,请确保 @WorkerIdBigLength 和 @SeqBigLength 的设置值跟其它应用程序相同
set @WorkerId = 1 -- 最大值 2^@WorkerIdBigLength-1
set @WorkerIdBigLength = 4 -- 规则约束:@WorkerIdBigLength+@SeqBigLength<23
set @SeqBigLength = 8 -- 建议不小于6在当前SQL版本中@SeqBigLength 决定随机数的最大值未采用自增数这需要数据表记录Seq值
-- End
-- 当前时间戳(毫秒单位)
set @CurrentTime = CONVERT(BIGINT,DATEDIFF(MI,'1970-01-01 00:00:00.000', GETUTCDATE())) * 60000 + DATEPART(S,GETUTCDATE()) * 1000 + DATEPART(MS, GETUTCDATE())
-- 用当前时间戳减去基础时间得出ID的时间差部分
set @TimeTick=@CurrentTime-1582136402000
-- 生成ID
-- 雪花ID的序列数 = 5至2^SeqBigLength-1之间的随机数。 (5 + round((POWER(2, @SeqBigLength)-1) * rand(), 0)
return @TimeTick * POWER(2, @WorkerIdBigLength + @SeqBigLength) + @WorkerId * POWER(2, @SeqBigLength) + (5 + round((POWER(2, @SeqBigLength)-1) * @RandomSeed, 0))
end
GO