diff --git a/SQL/README.md b/SQL/README.md new file mode 100644 index 0000000..3556b1a --- /dev/null +++ b/SQL/README.md @@ -0,0 +1,9 @@ +# â�„ idgenerator-SQL + +## 介ç»� + +这里是在ä¸�å�Œæ•°æ�®åº“中生æˆ�雪花ID的脚本。 + + + + diff --git a/SQL/sqlserver.sql b/SQL/sqlserver.sql new file mode 100644 index 0000000..a35d3a1 --- /dev/null +++ b/SQL/sqlserver.sql @@ -0,0 +1,46 @@ +/* +Éè¼ÆËµÃ÷£º + +1.ÕâÊÇSQL ServerµÄÒ»¸öÄÚÖ÷½·¨£¬ÔËÐд˽ű¾ºó£¬½«ÔÚSQL ServerµÄ¡°¿É±à³ÌÐÔ-º¯Êý-±êÁ¿Öµº¯Êý¡±ÖÐÔö¼ÓÒ»¸ö·½·¨ Fn_NextSnowId + +2.Éú³ÉµÄID = ʱ¼ä²î + WokerId + Ëæ»úÊý + ʱ¼ä²î = µ±Ç°Ê±¼ä´Á£¨ºÁÃ뵥룩 - 1582136402000 + WorkerId = {ÅäÖÃÖµ} + Ëæ»úÊý = 5 ÖÁ 2^SeqBigLength-1 Ö®¼äµÄÕûÊý + +3.µ÷Ó÷½·¨£º + ÀýÈ磺select dbo.Fn_NextSnowId(rand()) + +*/ +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£¬²»Òª³¬¹ý22 + set @SeqBigLength = 8 + -- 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 + +