Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从sql查询生成alpha数值?_Sql_Sql Server 2005_Stored Procedures - Fatal编程技术网

如何从sql查询生成alpha数值?

如何从sql查询生成alpha数值?,sql,sql-server-2005,stored-procedures,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——这是一种非

我在存储过程中使用以下命令创建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——这是一种非常聪明的随机值方法,使用
orderbynewid()
。如果密码区分大小写,也可以使用小写字符:

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

好的,完成了……其中TYPE='p'和(数字在48和57之间或数字在65和90之间)我不完全确定(spt_值的使用)在时尚与鬼鬼祟祟的比例上落在哪里……但我有点喜欢它!@Anuya as“不仅仅可以问和回答你自己的问题,这是明确鼓励的。”所以我想说,把你的评论移到一个答案上,然后接受它。这也将阻止这个问题出现在未回答的列表上