Каков наиболее эффективный способ создания 8-символьной случайной буквенно-цифровой строки в TSQL? - PullRequest
16 голосов
/ 04 августа 2011

Я хочу создать уникальную 8-символьную случайную буквенно-цифровую строку в TSQL для ссылки для подтверждения почты. В настоящее время мы используем GUID , но он не очень удобен для пользователя.

Это действительно должно подчиняться нескольким правилам:

  • длина 8 символов
  • быть уникальным
  • генерируется эффективно

Ответы [ 3 ]

20 голосов
/ 24 июля 2013
SUBSTRING(CONVERT(varchar(255), NEWID()), 0, 7)
16 голосов
/ 04 августа 2011

Вот 2 способа решить эту проблему.

* 1002. * Метод 1: это сгенерирует 8 случайных символов и сохранит их в varchar @r, чтобы все идентичные символы не были идентичными, я добавил семя кRAND ().
DECLARE @r varchar(8)

SELECT @r = coalesce(@r, '') +CHAR(
CASE WHEN r between 0 and 9 THEN 48
WHEN r between 10 and 35 THEN 55
ELSE 61 END + r)
FROM
master..spt_values
CROSS JOIN
(SELECT CAST(RAND(ABS(CHECKSUM(NEWID()))) *61 as int) r) a
WHERE type = 'P' AND number < 8

Метод 2: Этот метод использует таблицу подсчета, каждый символ никогда не встречается более одного раза.Строки, используемые для генерации этих символов, рандомизируются путем упорядочения по newid ()

DECLARE @r varchar(8)

SELECT @r = coalesce(@r, '') + n
FROM (SELECT top 8 
CHAR(number) n FROM
master..spt_values
WHERE type = 'P' AND 
(number between ascii(0) and ascii(9)
or number between ascii('A') and ascii('Z')
or number between ascii('a') and ascii('z'))
ORDER BY newid()) a

. Чтобы обеспечить уникальность для каждого varchar (8), вы можете сохранить результаты в таблице и сравнить с результатами в этой таблице.,Вы также можете сделать varchar длиннее и просто надеяться на лучшее

0 голосов
/ 04 августа 2011

Вы можете использовать CHAR(ROUND(RAND() * 93 + 33, 0)) для генерации случайного символа.

Затем посмотрите, не является ли это одним из символов, которые вы можете запретить, например, одиночные кавычки, затем создайте свою строку, выполниввсе это в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...