sql - 如何从 SQL 查询生成字母数字值?

标签 sql sql-server-2005 stored-procedures

我在存储过程中使用以下代码创建 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 

但我希望输出为字母数字值,而不仅仅是数字值。我怎样才能得到它?

最佳答案

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

当然,这只包括任何给定的字符一次。尽管如此,它仍然是一种非常聪明的生成密码的方法。荣誉!

编辑: 如果你想有机会获得 double ,你可以这样做:

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 进行排序。

关于sql - 如何从 SQL 查询生成字母数字值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6419615/

相关文章:

java - 准备好的陈述是否以这种方式工作?

sql - 如何在sqlite中重用子查询的结果

SQL with 子句动态 where 参数

sql - Group By 基于另一列的聚合

sql - 我应该从多少条返回记录开始出现性能问题?

sql - 如何检查 SELECT 查询是否成功?

存储过程中的 MySQL PREPARE 语句

php - 自动调用PHP页面?

c# - 在T-SQL中处理CLR存储过程的多个结果

mysql - 在 mysql 表中爆炸的字段