我在我的存储过程中使用以下内容创建一个8位数的密码并将其作为输出返回。
select @AuthKey = @AuthKey + char(n) from
(
select top 8 number as n from master.. spt_values
where type= 'p' and number between 48 and 57
order by newid()
) as t
但我希望输出为字母数字值,而不仅仅是数值。我怎么能得到它?
答案 0 :(得分:1)
Anuya - 这是使用order by newid()
随机化值的一种非常聪明的方法。如果您的密码区分大小写,也可以使用小写字符:
declare @AuthKey varchar(255)
set @AuthKey = ''
select @AuthKey = @AuthKey + char(n) from
(
select top 8 number as n
from master..spt_values
where type= 'p' and (
(number between 48 and 57) -- numbers
or (number between 65 and 90) -- uppercase letters
or (number between 97 and 122) -- lowercase letters
)
order by newid()
) as t
print @AuthKey
使用略有不同的方法,您可以包含特定的字符集,包括符号:
declare @AuthKey varchar(255), @chars varchar(255), @len int
set @AuthKey = ''
set @chars = '012345ACDFGIJKLMSTXYZ_-#@!'
set @len = len(@chars)
select @AuthKey = @AuthKey + chr.c
from (
select substring(@chars, num.n, 1) as c
from (
select top 8 number as n
from master..spt_values
where type='p' and (number between 1 and @len)
order by newid()
) as num
) as chr
print @AuthKey
当然这只包括任何给定的角色一次。它仍然是一种非常聪明的密码生成方式。奖励!
编辑: 如果你想有机会获得双打,你可以这样做:
declare @AuthKey varchar(255), @chars varchar(255), @len int
set @AuthKey = ''
set @chars = '012345ACDFGIJKLMSTXYZ_-#@!'
set @len = len(@chars)
SELECT TOP 8 @AuthKey = @AuthKey + SubString(@chars, 1 + Convert(int, ABS(BINARY_CHECKSUM(NewID())) % @len), 1)
FROM master..spt_values
(稍微快一些,因为查询不需要对spt_values进行排序。