在TSQL中生成8个字符随机字母数字字符串的最有效方法是什么?

Kor*_*ich 20 t-sql sql-server

我想在TSQL中生成一个唯一的8个字符的随机字母数字字符串,用于邮件确认链接.我们目前正在使用GUID,但它不是非常用户友好.

它只需遵守一些规则:

  • 长8个字符
  • 独一无二
  • 有效地生成

Igo*_* Be 24

SUBSTRING(CONVERT(varchar(255), NEWID()), 0, 7)
Run Code Online (Sandbox Code Playgroud)

  • 由于[`SUBSTRING`](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/substring-transact-sql)的工作方式,`0,7`实际上会产生* * 6 **不是** 8 **字符。使用`1,8`将给您所需的8 (2认同)

t-c*_*.dk 16

以下是解决问题的两种方法

方法1:这将生成8个随机字符并将它们存储在varchar @r中,为了防止所有单个字符相同,我向RAND()添加了一个种子.

DECLARE @r varchar(8)

SELECT @r = coalesce(@r, '') +CHAR(
CASE WHEN r between 0 and 9 THEN 48
WHEN r between 10 and 35 THEN 55
ELSE 61 END + r)
FROM
master..spt_values
CROSS JOIN
(SELECT CAST(RAND(ABS(CHECKSUM(NEWID()))) *61 as int) r) a
WHERE type = 'P' AND number < 8
Run Code Online (Sandbox Code Playgroud)

方法2:此方法使用计数表,每个字符永远不会出现一次.用于生成这些字符的行通过在newid()上排序来随机化

DECLARE @r varchar(8)

SELECT @r = coalesce(@r, '') + n
FROM (SELECT top 8 
CHAR(number) n FROM
master..spt_values
WHERE type = 'P' AND 
(number between ascii(0) and ascii(9)
or number between ascii('A') and ascii('Z')
or number between ascii('a') and ascii('z'))
ORDER BY newid()) a
Run Code Online (Sandbox Code Playgroud)

为了确保每个varchar(8)的唯一性,您可以将结果存储在表中,并与该表中的结果进行比较.你也可以让varchar更长,只希望最好