Как генерировать значения альфа-номера из запроса SQL? - PullRequest
3 голосов
/ 21 июня 2011

Я использую нижеприведенное в своей хранимой процедуре, чтобы создать 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 

Но я хочу выводить как буквенно-цифровое значение, а не просто числовое значение.Как я могу получить это?

1 Ответ

1 голос
/ 29 июля 2011

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.

...