【问题标题】:Unique alphanumeric key generation in MSSQLMSSQL 中唯一的字母数字密钥生成
【发布时间】:2014-03-05 03:14:55
【问题描述】:

我有用作键的 char(4) 字段的表。生成的值(最大值 + 1)。但它没有达到最大值(9999)。无法更改列的数据类型,因为它在很多地方都使用过。

我想出了一个像下面这样的解决方案...

9999 -> A000...A999->B000...B999->Z999 -> ZA00->ZZZZ(zzzz再用10年就可以了)

请告诉我,除了执行 substring() 和字符串操作之外,还有一种简单的方法来生成它吗?

当前代码:

DECLARE @cle smallint
SELECT @cle = isnull(MAX(CONVERT(smallint,RTRIM(cle))),0) from smnf
INSERT INTO smnf (sup, cle, dsc, exc, dirty) VALUES (@sup, CONVERT(char(4), @cle+1), @dsc, 0, 'A')

【问题讨论】:

  • 你能显示你的代码是什么吗?很难说其他事情是否更容易。另外,不要只使用整数标识列。
  • DECLARE @cle smallint SELECT @ cle = isnull(MAX(CONVERT(smallint,RTRIM(cle))),0) 从 smnf INSERT INTO smnf (sup, cle, dsc, exc, dirty) 值(@sup, CONVERT(char(4), @ cle+1), @ dsc, 0, 'A') 现在无法使用整数,因为这是 100 多个应用程序使用的字段

标签: sql sql-server key


【解决方案1】:
SELECT i INTO #t FROM (SELECT '0' i UNION ALL SELECT '1' UNION ALL SELECT '2' UNION ALL SELECT '3' UNION ALL SELECT '4' UNION ALL SELECT '5' UNION ALL SELECT '6' UNION ALL SELECT '7' UNION ALL SELECT '8' UNION ALL SELECT '9' UNION ALL SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL SELECT 'D' UNION ALL SELECT 'E' UNION ALL SELECT 'F' UNION ALL SELECT 'G' UNION ALL SELECT 'H' UNION ALL SELECT 'I' UNION ALL SELECT 'J' UNION ALL SELECT 'K' UNION ALL SELECT 'L' UNION ALL SELECT 'M' UNION ALL SELECT 'N' UNION ALL SELECT 'O' UNION ALL SELECT 'P' UNION ALL SELECT 'Q' UNION ALL SELECT 'R' UNION ALL SELECT 'S' UNION ALL SELECT 'T' UNION ALL SELECT 'U' UNION ALL SELECT 'V' UNION ALL SELECT 'W' UNION ALL SELECT 'X' UNION ALL SELECT 'Y' UNION ALL SELECT 'Z') t

CREATE TABLE id_list (id char(4) PRIMARY KEY);

INSERT id_list
SELECT c1.i+c2.i+c3.i+c4.i
FROM #t c1, #t c2, #t c3, #t c4
WHERE c1.i+c2.i+c3.i+c4.i NOT LIKE '[0-9]%[A-Z]%'  --Eliminate alphas in the first 10000 to preserve existing ids.

当你需要下一个 id 时:

DECLARE @curr_id char(4) = '9ZZZ'
DECLARE @next_id char(4)

SELECT TOP 1 @next_id = [id] FROM id_list WHERE [id] > @curr_id

PRINT @next_id

A000

【讨论】:

  • 试过了,它适用于 SQL2K。但新的身份证不是预期的。正如我在 9999 之后我需要 A000 的问题所说的那样。但在这里它在 9999 之后返回 999A
  • 刚刚看了表(id_list)。在我的情况下,数字应该达到 9999(它已经被填满,我无法更改已经创建的 id)
  • 按照你的计划,'9A99'之后会发生什么?
  • 不可能出现“9A99”的情况,因为它必须达到最大值(“Z”)才能进入下一个。前任。 'ZA99'
  • 这是一个可怕的计划。您希望您的密钥按可排序的顺序排列。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2023-04-04
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多