2011-06-21 5 views
3

私は8桁のパスワードを作成し、それを出力として返すために私のストアドプロシージャで以下を使用しています。SQLクエリからアルファ値を生成するには?

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

さておき... \tどこのタイプ= 'p'と(48と57の間の数字か、65と90の間の数字) – Anuya

+1

*(spt_valuesの使用)*がスタイリッシュなもの卑劣なスケール...しかし、私はそれのような種類! –

+0

@Anuyaとして[このブログのポストノート](http://blog.stackoverflow.com/2011/07/its-自分の質問に答えるだけでOKですが、明示的に奨励されています) "と答えています。それ。これにより、この質問は未回答のリストに表示されなくなります –

答えて

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 = '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を必要としないよう(あまりにも少し速くなります

関連する問題