TSQL生成5个字符长度的字符串,数据库中尚不存在的所有数字[0-9]

Bra*_*rad 2 sql sql-server random

最好的方法是什么?

我需要生成一个5位长的字符串,其中所有字符都是数字.但是,我需要能够执行此'x'次(用户变量)并将此随机字符串存储在数据库中.此外,我不能两次生成相同的字符串.6个月后将删除旧琴弦.

伪代码

DECLARE @intIterator INT,
 @intMax

SET @intIterator = 1
SET @intMax = 5 (number of strings to generate)

WHILE @intIterator <= @intMax
 BEGIN

  -- GENERATE RANDOM STRING OF 5 NUMERIC DIGITS 
   ???

  -- INSERT INTO DB IF DOESN'T ALREADY EXIST 
  INSERT INTO TSTRINGS
  SELECT @RANDOMSTRING

  IF @@ERROR = 0
    SET @intIterator = @intIterator + 1

 END
Run Code Online (Sandbox Code Playgroud)

我知道这可能不是最好的方法,所以建议值得赞赏.但真正寻找有关如何生成数字5长度字符串的想法.

Jul*_*iet 6

"显而易见"的方式可以描述为" key = random; while (key already selected) { key = random }".它有效,但是生日悖论意味着我们的钥匙碰撞几率以惊人的指数速率增加,与已经使用过的钥匙数成比例.因此,选择随机密钥对于每个新密钥平均指数地变长,并且很可能最终陷入无限或任意长的循环中.

您最好先预先生成密钥列表,如下所示:

  • 保持一个UniqueKeys包含所有预先计算的字符串'00000'...'99999'的表,以及一个keyOrder始终初始化为newId()插入的字段.keyOrder应该编入索引.

  • 当你需要"生成"一个字符串时,你可以在几乎恒定的时间内拉出下一个可用的密钥.现在您有了一个密钥,您可以将其删除以防止它被重用.SELECT TOP 1 key FROM UniqueKeys ORDER BY keyOrderUniqueKeys

  • 每隔六个月,截断并重新生成您的UniqueKeys表格.

这种风格的优点是相对简单的实现,几乎恒定的时间来生成下一个密钥,并避免上面讨论的令人讨厌的"检查是否存在于循环中".