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

Sql server 在TSQL中生成8个字符的随机字母数字字符串的最有效方法是什么?,sql-server,tsql,Sql Server,Tsql,我想在TSQL中为邮件确认链接生成一个唯一的8个字符的随机字母数字字符串。我们目前使用的是GUID,但它对用户不是很友好 它只需要遵守一些规则: 长度为8个字符 独一无二 高效生成 您可以使用 CHAR(ROUND(RAND()*93+33,0))生成随机字符 然后查看这是否是您可能不允许的字符之一,例如单引号,然后构建字符串,在循环中执行所有这些操作。这里有两种解决方法 方法1:这将生成8个随机字符并将它们存储在varchar@r中,为了防止所有单个字符完全相同,我在RAND()中添加了一个

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

它只需要遵守一些规则:

  • 长度为8个字符
  • 独一无二
  • 高效生成
    • 您可以使用
      CHAR(ROUND(RAND()*93+33,0))
      生成随机字符


      然后查看这是否是您可能不允许的字符之一,例如单引号,然后构建字符串,在循环中执行所有这些操作。

      这里有两种解决方法

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


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

      Does
      LEFT(NEWID(),8)
      不做您需要的事情吗?(结合一个独特的约束条件)类似的问题:[1]:@MartinSmith I的想法是一样的,但这些数字通常都是相同的,而且它们不是随机的。你几乎可以肯定,在这个脚本中得到的字符不是字母数字,如果你在我的第一个例子中使用它,你会得到8个相同的字符。你有一个额外的括号,但我删除了它。感谢您分享+1由于其工作方式,
      0,7
      将实际生成6个字符,而不是8个字符。使用
      1,8
      将为您提供所需的8,这将8个十六进制数转换为varchar。它将消除字母表的其余部分。如果使用方法1生成大量数据,请小心。行
      RAND(ABS(CHECKSUM(NEWID()))
      将每隔40亿次调用一次。问题是当校验和产生最大可能的负整数(-2147483648)时这个值被输入ABS函数。最大可能的正整数是2147483647。这会导致算术溢出。我的解决方案是这个表达式
      RAND(Utilities.CapForRand(ABS(CAST(二进制校验和(NEWID())为bigint)))
      将二进制校验和的结果强制转换为bigint可以绕过ABS中的算术溢出,因为bigint将保存2147483648,并且当传递一个bigint时ABS将进入bigint模式。但是RAND需要一个int,因此我编写了一个实用函数,该函数接受一个bigint,如果它大于最大可能的正int,则返回l尽可能大的正整数,否则它将以整数形式返回传入的值。@GilesRoberts,您介意回顾一下并告诉我它是否正确。干杯!
      SUBSTRING(CONVERT(varchar(255), NEWID()), 0, 7)
      
      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
      
      SUBSTRING(CONVERT(varchar(255), NEWID()), 0, 7)