quinta-feira, 27 de agosto de 2009

Random no SQLServer

A função Rand no SQLServer, assim como descriton o BOL, "Retorna um valor float pseudo-aleatório de 0 a 1, exclusivo" e "Chamadas repetitivas de RAND() com o mesmo valor de semente retornam os mesmos resultados. ". Ou seja, de Randomico não tem praticamente nada.

Mas dá para contornar isso usando alguns artificios.

Exemplo, execute algumas vezes repetidas esta linha:
SELECT RAND(), RAND(3);

Os resultados não mudam.

Idem Aqui:
SELECT RAND(159784);
SELECT RAND(159784);
SELECT RAND(159784);

Aqui vou apresentar 2 meios (Existem vários) de fazer com que o Rand realmente seja um Rand, utilizando seu parametro de seed.

1) Usando uma Data:

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
+ (DATEPART(ss, GETDATE()) * 1000 )
+ DATEPART(ms, GETDATE()) );

2) Usando o o NewID:


SELECT RAND(CAST( NEWID() AS varbinary ));


Com isso em mãos, é possivel então estabelecer limites Mínimos e Máximos para o Random:


DECLARE @Upper INT;
DECLARE @Lower INT


SET @Lower = 1 ---- The lowest random number
SET @Upper = 999 ---- The highest random number

--Para gerar Randomicamente os números em float:
SELECT Cast((@Upper - @Lower -1) * RAND(CAST(NEWID() AS varbinary)) + @Lower as Float)

--Para gerar Randomicamente os números em Int:
SELECT Cast((@Upper - @Lower -1) * RAND(CAST( NEWID() AS varbinary )) + @Lower as Int)

Nenhum comentário:

Postar um comentário