使用SQL Server生成随机密钥
我使用下面的函数生成5个字母的随机键,但它是所有字母和数字的组合 但根据要求,我需要生成一个随机唯一密钥,该密钥不包含字符“o”和“I”,也不包含数字“0”和“1”使用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
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)
);