Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Генератор случайных символов  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
Добрый день господа!!

подскажите пожалуйста, мне необходимо генерировать случайными символами строку длиной 12 символов, делаю следующим образом:

DECLARE @IDKEY VARCHAR(12),@X int 
SET @IDKEY = SubString(EncryptByPassPhrase('1', '1'), 5, 12)

WHILE exists (SELECT IDKEY FROM RULES WHERE IDKEY = @IDKEY)
 BEGIN
  SET @IDKEY = SubString(EncryptByPassPhrase('1', '1'), 5, 12)
 END

SELECT @IDKEY

результат:
@ФDCн*%Љі7
 BїќШV>%у|Н
но хотелось бы ограничить диапазон символов [a..z] и чисел [0..9], подскажите пожалуйста может существует более рациональный подход??
12 авг 13, 14:11    [14696768]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Glory
Member

Откуда:
Сообщений: 104760
DmitryVT
но хотелось бы ограничить диапазон символов [a..z] и чисел [0..9], подскажите пожалуйста может существует более рациональный подход??

Генерировать случайное число из диапазона, соответстующего символам [a..z]
12 авг 13, 14:12    [14696779]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
не до понимаю одного обстоятельства ((

выполнив

select SubString(EncryptByPassPhrase('1', '1'), 5, 12)


получаю то что мне собственно и нужно, к переменной @IDKEY приравняв результат генератора - получаю совсем не то что вернул генератор

DECLARE @IDKEY varchar(12)
SET @IDKEY = SubString(EncryptByPassPhrase('a', 'z'), , 12)

WHILE exists (SELECT IDKEY FROM RULES WHERE IDKEY = @IDKEY)
 BEGIN
  SET @IDKEY = SubString(EncryptByPassPhrase('1', '1'), 5, 12)
 END

SELECT @IDKEY


может я что то с типом данных напутал ??
12 авг 13, 14:27    [14696905]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
DmitryVT,

а все должны быть в курсе о EncryptByPassPhrase?
12 авг 13, 14:35    [14696965]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Glory
Member

Откуда:
Сообщений: 104760
DmitryVT
может я что то с типом данных напутал ??

А может с кодом ?

SET @IDKEY = SubString(EncryptByPassPhrase('a', 'z'), , 12)
SET @IDKEY = SubString(EncryptByPassPhrase('1', '1'), 5, 12)
12 авг 13, 14:37    [14696973]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
вот, написал велосипед
;with nums as(
select 1 val
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
union all
select 7
union all
select 8
union all
select 9
union all
select 10
union all
select 11
union all
select 12
)
,genWord as(
select 
CASE  n2.val%2 
						WHEN 1 THEN l.val
						WHEN 0 THEN numb.val
						else ''
						end newSymbol
	,nums.val orderNum					
from	nums
		cross apply (select ABS(CHECKSUM(NEWID()))) n(val)
		cross apply (select ABS(CHECKSUM(NEWID()))) n2(val)
		cross apply (select CHAR(n.val%(25)
					+ CASE  n.val%2 
						WHEN 1 THEN  65
						WHEN 0 THEN 97
						end) )l(val)
		cross apply(select CHAR(n.val%(10)
					+ 48) )numb(val)
)
select 
	
	(SELECT newSymbol AS [text()]  
FROM genWord  
ORDER BY orderNum
FOR XML PATH(''), TYPE).value('.[1]', 'VARCHAR(MAX)')	
					
12 авг 13, 14:41    [14697006]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
да именно с кодом, спасибо огромное ))
12 авг 13, 14:42    [14697009]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
DmitryVT
DECLARE @IDKEY VARCHAR(12)
А ничего, что EncryptByPassPhrase возвращает
ENCRYPTBYPASSPHRASE (Transact-SQL)
varbinary с максимальным размером 8000
12 авг 13, 14:45    [14697034]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Glory
Member

Откуда:
Сообщений: 104760
declare @upperbound int  
declare @lowerbound int 
select @lowerbound = 65, @upperbound=90

declare @len integer, @i integer, @result varchar(8000)
set @len = 8
set @i = 1
set @result = ''

while @i <= @len
begin
	set @result = @result + CHAR(cast(((@upperbound - @lowerbound + 1) * Rand() + @lowerbound) as int))
	set @i = @i+1
end
select lower(@result)
12 авг 13, 14:46    [14697043]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
invm
Member

Откуда: Москва
Сообщений: 9401
declare @s varchar(30);

with x as
(
 select
  c
 from
  (
   values
    ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),
    ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('j'),
    ('k'), ('l'), ('m'), ('n'), ('o'), ('p'), ('q'), ('r'), ('s'), ('t'),
    ('u'), ('v'), ('w'), ('x'), ('y'), ('z')
  ) t(c)
)
select
 @s = (
  select top (12)
   c
  from
   x
  order by
   newid()
  for xml path(''), type).value('.', 'varchar(30)');

 select @s;
12 авг 13, 14:47    [14697052]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
Спасибо всем откликнувшимся !!!!! GLORY тебе отдельно спасибки !!
12 авг 13, 14:54    [14697098]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
fefwef
Guest
invm
declare @s varchar(30);

with x as
(
 select
  c
 from
  (
   values
    ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),
    ('a'), ('b'), ('c'), ('d'), ('e'), ('f'), ('g'), ('h'), ('i'), ('j'),
    ('k'), ('l'), ('m'), ('n'), ('o'), ('p'), ('q'), ('r'), ('s'), ('t'),
    ('u'), ('v'), ('w'), ('x'), ('y'), ('z')
  ) t(c)
)
select
 @s = (
  select top (12)
   c
  from
   x
  order by
   newid()
  for xml path(''), type).value('.', 'varchar(30)');

 select @s;


Прикольно!

order by
newid()
12 авг 13, 15:32    [14697476]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Гость333
Member

Откуда:
Сообщений: 3683
fefwef
Прикольно!

order by
newid()

Прикольно, только в данном случае будут генерироваться строки из неповторяющихся символов. Что в общем случае не эквивалентно строке из случайных символов.
12 авг 13, 15:37    [14697509]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
fefefeeee
Guest
ккум
Гость333
fefwef
Прикольно!

order by
newid()

Прикольно, только в данном случае будут генерироваться строки из неповторяющихся символов. Что в общем случае не эквивалентно строке из случайных символов.


можно запилить 12 раз

values
('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),
...
('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'),

только это уже будет не так прикольно. :)
12 авг 13, 15:52    [14697598]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Попробовать
RAND(CHECKSUM(NEWID()))
для генерации кода символа на каждой строке перед конкатенацией.
12 авг 13, 16:04    [14697680]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
ну и я вдогонку закину вариантик
if OBJECT_ID('my_nums') is null begin
   create table my_nums (npp int constraint my_nums_PK primary key, chr char(1))
   insert my_nums 
      select top (62)
         row_number() over (order by number)-1 npp, 
         CHAR(number)chr 
      from master..spt_values 
      where type='P' and char(number) like '[0-9a-z]'
--select * from my_nums
end

select 
   (select chr from my_nums where npp=r01)+(select chr from my_nums where npp=r02)+(select chr from my_nums where npp=r03)+
   (select chr from my_nums where npp=r04)+(select chr from my_nums where npp=r05)+(select chr from my_nums where npp=r06)+
   (select chr from my_nums where npp=r07)+(select chr from my_nums where npp=r08)+(select chr from my_nums where npp=r09)+
   (select chr from my_nums where npp=r10)+(select chr from my_nums where npp=r11)+(select chr from my_nums where npp=r12)psw
from (values (
   ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,
   ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,
   ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62,ABS(CHECKSUM(NEWID()))%62
   ))rnd(r01,r02,r03,r04,r05,r06,r07,r08,r09,r10,r11,r12)
-- cross apply (select 1 union all select 2 union all select 3 union all select 4 union all select 5) c(n)

-- drop table my_nums
12 авг 13, 16:07    [14697702]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Что-то, товарищи, очень много у вас буков =)


DECLARE @CharPool Varchar(100) = '0123456789qazwsxedcrfvtgbyhnujmiklop'
DECLARE @Len Int = LEN(@CharPool)
SELECT
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % ((@Len + 1) + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 )  
12 авг 13, 16:36    [14697947]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Упс, опечатка.

Вот

DECLARE @CharPool Varchar(100) = '0123456789qazwsxedcrfvtgbyhnujmiklop'
DECLARE @Len Int = LEN(@CharPool)
SELECT
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 )  
12 авг 13, 16:37    [14697957]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
tertewrtwer
Guest
Cammomile
Что-то, товарищи, очень много у вас буков =)


DECLARE @CharPool Varchar(100) = '0123456789qazwsxedcrfvtgbyhnujmiklop'
DECLARE @Len Int = LEN(@CharPool)
SELECT
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % ((@Len + 1) + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 ) +
  SUBSTRING(@CharPool,(ABS(CHECKSUM(NewId())) % (@Len + 1) ),1 )  


мой боян "малобукв"

declare @s varchar(12) = '';

;with
l0(n) as (select 1 union all select 1),
l1(n) as (select 1 from l0 t1, l0 t2),
l2(n) as (select 1 from l1 t1, l1 t2)
select top(12) @s += char(rand(checksum(newid())) * 25 + 65)
from l2

select @s;
12 авг 13, 16:48    [14698030]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
1 - автор делал заявку на цифры 0..9
2 - тогда уж вот так =)
declare @s varchar(12) = '' 
select  @s += char(rand(checksum(newid())) * 25 + 65)
from sys.objects
select @s; 
12 авг 13, 16:58    [14698099]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Cammomile
Что-то, товарищи, очень много у вас буков =)
Ну так 26(a..z)+26(A..Z)+10(0..9)=62
Хотя конечно через строку быстрее :)
12 авг 13, 16:59    [14698101]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А вот если автора устроит не A-Z , а A-F то вообще

SELECT LEFT(REPLACE(CAST(NEWID() AS Varchar(100)),'-' ,''), 12)
12 авг 13, 17:12    [14698193]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Empirical
Member

Откуда:
Сообщений: 99
я не успеваю записывать в свой читшит-блокнотик!
12 авг 13, 17:33    [14698296]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
declare @pwd varchar(20)
declare @pwdchars varchar(100),@pwdlen int,@counter int

			SELECT @pwdchars = '0123456789qwertyuiopasdfghjklzxcvbnm9876543210QWERTYUIOPASDFGHJKLZXCVBNM9876543210', --символы для генерации
			@pwdlen = 12,--нужная длина
			@counter = 0,
			@pwd	=	N''
		while @counter<@pwdlen
		begin
			select 
				@pwd=@pwd+substring(@pwdchars, cast(rand()*len(@pwdchars)+1 as int) ,1),
				@counter = @counter+1
		end
		select @pwd

Можно попробовать таким образом...
13 авг 13, 08:33    [14699828]     Ответить | Цитировать Сообщить модератору
 Re: Генератор случайных символов  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
афигеть сколько мыслей и вариантов ))

Всем спасибо, скоро и я буду помогать Вам (вот только чуть чуть еще книжек и НОРМ будет)

ТЕМА ЗАКРЫТА
ВСЕМ ОГРОМНОЕ СПАСИБО
13 авг 13, 16:00    [14703186]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить