Estou tentando criar um procedimento armazenado para gerar aleatoriamente dois caracteres alfanuméricos exclusivos do seguinte conjunto de caracteres no SQL Server 2016: ABCDEFGHIJKLMNPQRSTUVWXYZ0123456789
(conjunto de 35 caracteres). Os valores aleatórios serão então armazenados em uma coluna personalizada na AspNetUsers
tabela.
Atualmente, apenas 132 valores exclusivos de 2 caracteres são armazenados na AspNetUsers
tabela, enquanto pode haver um total de 1.225 permutações. Isso é baseado na fórmula de permutações: n! / (n - r)!
ou 35! / (35 - 2)! = 1225
.
O código a seguir, baseado neste exemplo, funciona algumas vezes, enquanto outras vezes se torna um loop infinito. O WHILE externo garante que o valor seja único na tabela onde será armazenado.
DECLARE @length int, @charpool varchar(256), @poollength int,
@loopcount int, @randomstring varchar(100)
SET @Length = 2
-- define allowable character explicitly - easy to read this way an easy to
SET @CharPool = 'ABCDEFGHIJKLMNPQRSTUVWXYZ0123456789'
SET @PoolLength = Len(@CharPool)
SET @LoopCount = 0
SET @RandomString = ''
WHILE (SELECT count(*) FROM AspNetUsers anu WHERE anu.CustomId = @randomstring) > 0 BEGIN
WHILE (@LoopCount < @Length) BEGIN
SELECT @RandomString = @RandomString +
SUBSTRING(@Charpool, CONVERT(int, RAND() * @PoolLength) + 1, 1)
SELECT @LoopCount = @LoopCount + 1
END
END
PRINT @randomstring
Você pode fazer algo assim:
A ideia principal é gerar uma lista de números entre 1 e len(charpool) que é então usada para criar a combinação de caracteres usando SUBSTRING.
Para gerar um novo valor aleatório, basta adicionar um
WHERE NOT EXISTS
que verifique a tabela original.Todo o sys.objects pode ser substituído
GENERATE_SERIES
se você estiver em uma versão suficientemente nova do SQL Server.