Oi! Seja bem-vindo!
Hoje vamos estudar como gerar números aleatórios no SQL Server! Técnica útil não só para gerar os números da sua próxima loteria surpresinha, mas também para criar cargas de dados para teste…
Como gerar números aleatórios no SQL Server
Nosso script de hoje está dividido em 3 partes:
1) Como gerar números aleatórios individualmente
2) Como gerar listas de números aleatórios
3) Variações que você poderá encontrar no mercado
As principais funções que usaremos para gerar números aleatórios são:
– newid(): Gera um GUID (global unique identifier) ou identificador único global. Essa função é bem legal porque cria um texto com base na data-hora e no hardware da sua máquina, ou seja, o texto que for gerado na sua máquina não será gerado em lugar algum do mundo. 🙂
– checksum(): Gera uma assinatura numérica para textos. Com essa função podemos converter o texto aleatório gerado pela função newid em números.
– abs(): É comum que desejemos gerar apenas números positivos, e nesse caso essa função cai como uma luva, pois ela converte valores para positivo.
------------------------------------------------------------------ -- Gerar números aleatórios no SQL Server ------------------------------------------------------------------ ---------------------------------------------- -- Newid ---------------------------------------------- -- Exemplo 1: Inteiro aleatório select newid() as string_aleatorio, checksum(newid()) as inteiro_aleatorio -- Exemplo 2: Inteiro aleatórios (sempre positivo) select abs(checksum(newid())) as int_aleatorio_positivo -- Exemplo 3: Inteiro aleatórios (entre -60 e 60 - resto da divisão inteira por 61) select checksum(newid()) %61 as int_aleatorio_range -- Exemplo 4: Inteiro aleatórios (entre 1 e 60 para mega-sena) select (abs(checksum(newid())) % 60) + 1 as int_aleatorio_mega -- Exemplo 5: Número inteiro com ATÉ X digitos (no exemplo, 5 digitos) select left(checksum(newid()), 5) as int_aleatorio_5_digitos -- Exemplo 6: BIGINT select convert(bigint, convert(varbinary(8), newid())) as bigint_aleatorio -- Exemplo 7: DECIMAL select convert(decimal(38,10), left(convert(varchar, convert(bigint, convert(varbinary(8), newid()))) + '.' + convert(varchar, abs(checksum(newid()))), 38)) as decimal_aleatorio -- Exemplo 8: FLOAT select convert(float, left(convert(varchar, convert(bigint, convert(varbinary(8), newid()))) + '.' + convert(varchar, abs(checksum(newid()))), 38)) as decimal_aleatorio ---------------------------------------------- -- Gerando listas de números aleatórios ---------------------------------------------- -- Exemplo 1: Usando CTE recursiva (meu preferido!) ;with cte_seq as ( select 1 as sequencia, checksum(newid()) as int_aleatorio_positivo union all select sequencia + 1, checksum(newid()) from cte_seq where sequencia < 1000 ) select * from cte_seq option (maxrecursion 0) -- option (maxrecursion 0) permite loops + de 100 itens -- Exemplo 2: Usando loop ou cursor declare @i smallint = 1 while @i <= 1000 begin print checksum(newid()) set @i+= 1 end -- Exemplo 3: Usando select em tabelas select top 1000 left(convert(int, crypt_gen_random(8)), 2) as meu_preferido_sql2012 from sysobjects a full join sysobjects b on 1 = 1 ---------------------------------------------- -- Outras formas ---------------------------------------------- -- FC matemática rand e rand com seed -- OBS: Note que ao executar os dois comandos juntos o valor não é aleatório select rand() select rand(123) -- FC matemática rand (inteiro em um range) declare @maior int; declare @menor int set @menor = 1 ---- menor número set @maior = 60 ---- maior número select round(((@maior - @menor -1) * rand() + @menor), 0) -- FC matemática rand (decimal) -- Entre 0 e 20 (decimal) select 20 * rand() -- Entre 10 e 30 select 10 + 20*rand() -- FC criptografica select convert(bigint, crypt_gen_random(8)) -- FC sysdatetime (ns = nanosegundos) select (datepart(ns, sysdatetime())) -- Qual é a sua preferida? :-)
CONCLUSÃO
Ao terminar esse artigo fiquei pensando como uma coisa aparentemente inútil 🙂 como essa é tão útil… Além de usar números aleatórios em inúmeras situações de criptografia, literalmente já usei centenas de vezes para gerar cargas de dados para testes de performance ou funcionalidade de software.
Espero que tenha gostado do artigo, nos vemos no próximo!
Abraço do seu amigo Josué
Me encanto com Banco de Dados, gostaria de aprender mais sou iniciante!
E ai amigo, bom dia! Somos dois, continuo encantado após quase 20 anos 🙂 Dá uma olhada nesse post: https://dba-pro.com/t-sql-do-zero-ao-master-lc08