程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了自增值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决自增值?

开发过程中遇到自增值的问题如何解决?下面主要结合日常开发的经验,给出你关于自增值的解决方法建议,希望对你解决自增值有所启发或帮助;

我正在处理一个本地项目,我想在名为 serial 的 sql Server 表中设置一列。此值应具有下一个格式/验证 [A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]。四个带有数字或大写字母的字符。

例如,第一条记录是AAA0,然后从右到左开始递增,但有趣的是,一旦到达AAA9,我想继续但是用字母,所以一旦达到 9,继续 A:AAAA。我的最后一个组合是 AAAZ,然后继续第二个位置,依此类推,直到我可以完成 ZZZZ

serial
------
AAA0
…
AAAZ
AAB0
…
AABZ
AAC0
…
AACZ
…
ZZZZ

我已经能够做类似的事情,但例如只增加数字 0000 到 9999 或只增加字母 AAAA 到 ZZZZ(见下面的虚拟数据)。

自增值

如果您有任何意见或者您以前见过这种情况,请告诉我。我将不胜感激。

我查看了互联网上的一些数据并进行了这个小测试,但再一次,这是在改变字母。

create table #myTable
(
    MyheadID int idENTITY(0,1) NOT NulL,Consecutive AS 
            CHAR(MyheadID/17576%26+65) +        --26^3
            CHAR(MyheadID/676%26+65)  +         --26^2
            CHAR(MyheadID/26%26+65)  +          --26^1
            CHAR(MyheadID%26+65)                --26^0
                PERSISTED  NOT NulL,UniquEID VARCHAR(36) NOT NulL,Createddate DATEtime DEFAulT GETDATE()
)

 INSERT INTO #myTable (UniquEID) 
    (SELECT NEWID())

 SELECT Consecutive FROM #myTable

我们不讨论 UniquEIDCreatedDate 列,它们仅用于测试目的。我创建了一个标识列,然后是字母自动增量的代码。

我也在这里找到了这个 reply 但这不是我的情况,因为在那个回复中他们将 4 个字母和 4 个数字与一个可以解析的子字符串分开。就我而言,我需要从右到左对数字和字母进行互算。

解决方法

这是一个可能的解决方案,以 36 进制 AAA0 为基数从十进制 479879 开始计数。

理想情况下,您的表上应该有一个从 479879 开始的身份递增数字。使用 CTE 生成的数字表模拟它,以下给出 base36 计数:

with numbers as (
    SELEct 479879 + Row_number() over (order by a.object_id)n 
    from sys.all_objects a cross join sys.all_objects b
)
SELEct top 10000
    Concat(Char(((n/36/36/36) % 36) + case when (n/36/36/36) % 36 between 0 and 9 then 48 else 55 end),Char(((n/36/36) % 36) + case when (n/36/36) % 36 between 0 and 9 then 48 else 55 end),Char(((n/36) % 36) + case when (n/36) % 36 between 0 and 9 then 48 else 55 end),Char((n % 36) + case when n % 36 between 0 and 9 then 48 else 55 end)) Base36
from numbers 
order by n

见Fiddle

,

上一个答案很好,但您可以这样做并用简单的数学计算涵盖所有数字。另外,假设您的 IDENTITY 从 1 开始。每个数字有 36 个值,因此这些值是根据指出的 36 进制编码的。正如您在帖子中提到的,编码依次为 0 - 9 和 A - Z。从右到左获取某个数字 n 的各个数字,算法如下:

  1. n mod 36 是最右边的数字。
  2. n / 36 mod 36 给出从右数第二个数字。
  3. n / (36 * 36) mod 36 给出倒数第二个数字。
  4. n / (36 * 36 * 36) mod 36 给出左数。

为了测试这个逻辑,我们可以写一个函数:

create functION Customnumber(@id int)
RETURNS CHAR(4)
AS BEGIN
    RETURN CHAR((@id-1)/ POWER(36,3)% 36+CASE WHEN (@id-1)/ POWER(36,3)% 36 betweeN 0 AND 9 THEN 48 ELSE 55 END) 
    +CHAR((@id-1)/ POWER(36,2)% 36+CASE WHEN (@id-1)/ POWER(36,2)% 36 betweeN 0 AND 9 THEN 48 ELSE 55 END)
    +CHAR((@id-1)/ 36% 36+CASE WHEN (@id-1)/ 36% 36 betweeN 0 AND 9 THEN 48 ELSE 55 END)
    +CHAR((@id-1)% 36+CASE WHEN (@id-1)% 36 betweeN 0 AND 9 THEN 48 ELSE 55 END);
END;

然后我们可以通过调用它来测试这个函数以确保它工作。要调用它,让我们创建一些数字。这完全是矫枉过正,但让我们将它传递给 1 到 1,000,000,以便我们可以看到它的实际效果:

;WITH digits (I)
AS ( 
   SELECT I 
   FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS digits (I) ),Integers (I)
AS (SELECT D1.I + (10 * D2.I) + (100 * D3.I) + (1000 * D4.I) + (10000*D5.I) + (100000*D6.I)
    FROM digits AS D1
        CROSS JOIN digits AS D2
        CROSS JOIN digits AS D3
        CROSS JOIN digits AS D4
        CROSS JOIN digits AS D5 CROSS JOIN digits AS D6
      )
SELECT I,dbo.Customnumber(I)
FROM Integers 
WHERE I > 0
ORDER BY I;

如果你运行它并耐心等待(在我的弱笔记本电脑上大约需要 20 秒,但如果你不喜欢你不必使用一百万个数字)你会看到它确实产生了你想要的结果想。此时我们知道公式是正确的,因此您可以选择将其添加到表格中。

一种选择是像您一样将公式用作 PERSISTED 列。另一种选择是使用触发器。您可以将公式保留为函数,也可以直接将代码放入。如果您需要超过 4 个字符,您可以按照模式轻松添加另一个字符(只需更改您提出的 POWER)。

正如我所提到的,前面的答案很好,我只是想展示另一种方法及其派生。我不得不多次使用不同的格式实现自定义序列,您可以使用这种通用技术。

大佬总结

以上是大佬教程为你收集整理的自增值全部内容,希望文章能够帮你解决自增值所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:自增值