Você já precisou gerar uma lista de números aleatórios no SQL Server? Pode parecer uma tarefa simples, mas não é tão direta quanto parece. A função de número aleatório embutida, RAND(), possui algumas falhas inerentes que podem levar a resultados inesperados.
De acordo com a documentação do SQL Server, RAND() retorna um valor float pseudo-aleatório de 0 a 1, exclusivo. Isso significa que se você executar a função RAND() várias vezes dentro da mesma consulta, obterá resultados diferentes a cada vez. No entanto, se você usar o RAND() em uma instrução SELECT que retorna várias linhas, todas as linhas terão o mesmo valor “aleatório”.
Uma maneira de superar essa limitação é especificar explicitamente um valor de semente para a função RAND(). Ao passar um identificador exclusivo, como a coluna object_id da tabela de sistema sys.objects, você pode garantir que cada linha receba um valor “aleatório” diferente. No entanto, se os valores de semente estiverem próximos, os valores aleatórios resultantes também estarão próximos.
Uma solução melhor é usar uma combinação de funções para gerar um conjunto de números mais aleatórios. Uma abordagem é usar a função NEWID() para gerar um identificador exclusivo (GUID) e, em seguida, passá-lo para a função CHECKSUM() para obter um valor de checksum. Por fim, você pode usar o operador de módulo (%) para criar uma faixa de valores. Por exemplo, se você deseja uma faixa de -999 a 999, pode usar (% 1000) – 999.
Aqui está um exemplo de como você pode gerar uma lista de números aleatórios usando essa abordagem:
SELECT ABS(CHECKSUM(NEWID()) % 1000) AS NumeroAleatorio FROM sys.objects
Esta consulta retornará uma lista de números aleatórios entre -999 e 999. Se você desejar uma faixa diferente, poderá ajustar o valor do módulo de acordo.
É importante observar que os números gerados podem não ser completamente aleatórios, pois são baseados no GUID gerado por NEWID(). No entanto, eles devem ser suficientemente aleatórios para a maioria dos propósitos.
Então, da próxima vez que você precisar gerar uma lista de números aleatórios no SQL Server, considere usar essa abordagem para garantir um conjunto de valores mais diversificado e imprevisível.
Boa codificação!