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 = 'ACDFGIJKLMSTXYZ_-#@!'
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
もちろんこれだけ含み任意の与えられた文字を1回。それでもパスワードを生成するのは非常に巧妙な方法です。名誉!
編集: あなたはダブルスをもつ機会を持ちたい場合、あなたはこのようにそれを行うことができます。
declare @AuthKey varchar(255), @chars varchar(255), @len int
set @AuthKey = ''
set @chars = 'ACDFGIJKLMSTXYZ_-#@!'
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を必要としないよう(あまりにも少し速くなります
。
さておき... \tどこのタイプ= 'p'と(48と57の間の数字か、65と90の間の数字) – Anuya
*(spt_valuesの使用)*がスタイリッシュなもの卑劣なスケール...しかし、私はそれのような種類! –
@Anuyaとして[このブログのポストノート](http://blog.stackoverflow.com/2011/07/its-自分の質問に答えるだけでOKですが、明示的に奨励されています) "と答えています。それ。これにより、この質問は未回答のリストに表示されなくなります –