使用SQL Server生成随机密钥

使用SQL Server生成随机密钥,sql,sql-server,tsql,sql-server-2012,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2012,Sql Server 2014,我使用下面的函数生成5个字母的随机键,但它是所有字母和数字的组合 但根据要求,我需要生成一个随机唯一密钥,该密钥不包含字符“o”和“I”,也不包含数字“0”和“1” DECLARE @automateKey VARCHAR(15) DECLARE @Length INT = 6 DECLARE @Count INT = 2 SET @Length = @Length + 1 SET @Count = @Count + 1 SELECT @automateK

我使用下面的函数生成5个字母的随机键,但它是所有字母和数字的组合

但根据要求,我需要生成一个随机唯一密钥,该密钥不包含字符“o”和“I”,也不包含数字“0”和“1”

   DECLARE @automateKey VARCHAR(15)
   DECLARE @Length INT = 6
   DECLARE @Count INT = 2

   SET @Length = @Length + 1
   SET @Count = @Count + 1

   SELECT @automateKey =  
          (SELECT CAST((ABS(Checksum(NewId())) % 10) AS VARCHAR(1)) + 
                  CHAR(ascii('A')+(Abs(Checksum(NewId()))%25)) +
                  LEFT(newid(),@count) Random_Number)

   SELECT (@automateKey)
我不知道如何从随机密钥生成中摆脱这些特定字符和数字


有人能帮我回答这个问题吗?非常感谢。您的钥匙似乎有三个部分:

第一个字符是随机数0-10,其泛化为:

(Abs(Checksum(NewId()))%10)
第二个字符是随机字母,由以下内容生成:

CHAR(ascii('A')+(Abs(Checksum(NewId()))%25))
第三部分是三个字符,可以是字母或数字

LEFT(newid(),@count)
修改前两部分以消除不需要的字符并不难,但需要稍微修改到第三部分。 相反,您可以保持原样,并添加到while循环的末尾以搜索和替换不需要的字符-0和1为随机数,O和L为随机字母:

DECLARE @automateKey VARCHAR(15)
DECLARE @Length INT = 6
DECLARE @Count INT = 2

SET @Length = @Length + 1
SET @Count = @Count + 1
--this seems unnecessary , why not just SET @Count = 3 ?

SELECT @automateKey =  
      (SELECT CAST((ABS(Checksum(NewId())) % 10) AS VARCHAR(1)) + 
              CHAR(ascii('A')+(Abs(Checksum(NewId()))%25)) +
              LEFT(newid(),@count) Random_Number)

WHILE (@automateKey LIKE '%0%' OR @automateKey LIKE '%1%')
BEGIN
    SELECT @automateKey = REPLACE(@automateKey, '0', (Abs(Checksum(NewId()))%10))
    SELECT @automateKey = REPLACE(@automateKey, '1', (Abs(Checksum(NewId()))%10))
END

WHILE (@automateKey LIKE '%O%' OR @automateKey LIKE '%L%')
BEGIN
    SELECT @automateKey = REPLACE(@automateKey, 'O', CHAR(ascii('A')+(Abs(Checksum(NewId()))%25)))
    SELECT @automateKey = REPLACE(@automateKey, 'L', CHAR(ascii('A')+(Abs(Checksum(NewId()))%25)))
END

SELECT @automateKey
使用
RAND()
优于
NEWID()
,因为它本质上不是随机的

DECLARE 
    @Chars varchar(100) = 'ABCDEFGHJKLMNPQRSTUVWXYZ', 
    @CharsAndNumbers varchar(100) = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'

SELECT 
    CONCAT
    (
        -- Numbers 2-9
        FLOOR(RAND() * 8 + 2),

        -- Any UPPER CASE character but not I,O
        SUBSTRING(@Chars, CONVERT(int, RAND() * LEN(@Chars) + 1), 1),

        -- Numbers 2-9 and Any UPPER CASE charcter but not I,O
        SUBSTRING(@CharsAndNumbers, CONVERT(int, (RAND() * LEN(@CharsAndNumbers)) + 1), 1),
        SUBSTRING(@CharsAndNumbers, CONVERT(int, (RAND() * LEN(@CharsAndNumbers)) + 1), 1),
        SUBSTRING(@CharsAndNumbers, CONVERT(int, (RAND() * LEN(@CharsAndNumbers)) + 1), 1)
    )

我建议你做如下事情:

declare @chars varchar(255);
set @chars = 'ABCDEFGHIJKLMNPQRSTUVWXYZ23456789';

declare @i int;
set @i = 1;

declare @automateKey = varchar(255);

set @automatekey = '';

while @i <= 5
begin
    set @automateKey = @automateKey + substring(@chars, cast(rand() * len(@chars) + 1 as int), 1)
    set @i = @i + 1;
end;

您可以检查最后一个字符串是否包含0、1或O、L中的任何一个,然后替换为其他字母您提到的是随机键而不是随机值。生成的密钥是否需要唯一(即无DUP)?解决方案将取决于该要求。是的,很抱歉忘记了它应该是唯一的……只是澄清一下:您希望代码生成一个随机字符串,由一个数字、一个大写字母和三个附加数字组成。禁止使用数字
0
1
,禁止使用字母
I
O
。结果字符串对于以前发布的字符串的某些未指定列表必须是唯一的。并且代码必须在
insert
语句中可用。这包括一切吗?(四个值从0到7,一个值从0到23,映射到有效数字/字母的字符串。连接,检查
是否存在(?)
,根据需要重复。用户定义函数(UDF)?)非常感谢您的支持,但我如何将此值作为表的输入值包含到insert脚本中,我只需要5个字符的随机生成密钥..和你以前做的一样?在生成密钥和使用密钥之间只有两个额外的循环。
set @automateKey = (substring(@chars, cast(rand() * len(@chars) + 1 as int), 1) +
                    substring(@chars, cast(rand() * len(@chars) + 1 as int), 1) +
                    substring(@chars, cast(rand() * len(@chars) + 1 as int), 1) +
                    substring(@chars, cast(rand() * len(@chars) + 1 as int), 1) +
                    substring(@chars, cast(rand() * len(@chars) + 1 as int), 1)
                   );