jueves, agosto 22, 2019

Cómo generar un número random en SQL Server

Es cierto que SQL Server tiene la función RAND(), la cual genera un número aleatorio, pero este no funciona correctamente o por lo menos como uno lo espera, por lo tanto aquí vamos a explicar como generar los números aleatorios de forma correcta.

Por ejemplo RAND() si es ejecutado en transacciones distintas funciona perfectamente pero si es ejecutado varias veces en una misma transacción siempre nos va a retornar el mismo valor, por lo tanto el random no funciona.

Para probar esto que acabo de decir vamos a abrir el Management Studio y en un query nuevo hacemos

SELECT 
   newid() AS 'New id',
   RAND() AS 'Random',
   CHECKSUM(newid()) AS 'Checksum'

Resultado

 New IdRandomChecksum
1F3201996-A5E7-4B44-BDDE-FFF2A2499AB1 0.542140206197715 133238726

Resultado siguiente ves que se ejecuta

 New IdRandomChecksum
141B78E4A-9F73-47E0-8721-2190E699E696 0.216229945261277 926182060

Hasta aquí todo bien, las dos veces se ejecutó correctamente el random, como debe de ser, pero si se ejecuta varias veces en la misma transacción el resultado es otro

SELECT TOP 5 
   newid() AS 'New id',
   RAND() AS 'Mal Random',
   CHECKSUM(newid()) AS 'Checksum'
FROM sys.tables

Resultado

 New IdMal RandomChecksum
1C797611C-356C-47E4-97AD-14B331CECD7D 0.0296926785903021529445979
212600DA6-B399-4F31-9BED-186EECFAA8960.029692678590302-1163175142
37691D246-73DE-4DD6-944B-0FA3523F08900.0296926785903021893578383
469D663F5-0F40-4732-97FE-CB7F85B22E390.029692678590302526397255
5F82D3E07-66BF-4579-95D6-C745D9FAAF6E0.029692678590302-1752607711

Como podemos ver el valor Random siempre es el mismo, esto se debe a que si a la función Random el seed que utiliza SQL para generar el random es siempre el mismo, el seed de la transacción, por lo tanto el valor retorno siempre es el mismo. Entonces cómo se puede generar un valor random correcto?

En los query de ejemplo podemos ver la columna Checksum, la cual nos está retornando valores diferente en cada resultado, ya sea en transacciones distintas o en la misma transacción. Aquí está la clave para nuestro random.

Solución

New Id es un valor que genera SQL tomando como base el MAC address de la tarjeta de red y el reloj de la computadora, esto nos genera un string muy largo pero siempre distinto. Si a este valor le aplicamos la función checksum [ checksum(newid()) ] nos genera un valor numérico entero, que en algunos casos puede ser negativo. Si ocupamos que nuestro valor random sea un numérico entero positivo simplemente le aplicamos la funcion absolute [ abs(checksum(newid())) ]

Entonces si ahora combinamos estas tres funciones de SQL obtendremos el random que necesitamos

SELECT TOP 5
   RAND() AS 'Mal Random',
   abs(checksum(newid())) AS 'RANDOM'
FROM sys.tables

Resultado

 Mal RandomRANDOM
10.747613544929705149303544
20.7476135449297052063275895
30.7476135449297051150964410
40.7476135449297051372336738
50.7476135449297052115100305

Como podemos ver en los resultados, en cada ejecución la columna Random retorna de forma correcta los valores aleatorios siempre diferentes, sin importar la sesión en la que estemos ejecutando la consulta.

Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub

Redes Sociales

2,795FansMe gusta
342SeguidoresSeguir

Popular esta semana

ERROR PHP 7.2

Error: PHP Warning: count(): Parameter must be an array or an object that implements...

Como solucionar el error "PHP Warning: count() : Parameter must be an array or an object that implements Countable in..."

SQL Server: Error 3414, servicio no inicia

El error 3414 se produce generalmente cuando el motor de la base de datos SQL Server sufre algún evento imprevisto. Aquí lo solucionamos.

DELETE con subconsulta o INNER JOIN

En el siguiente ejemplo se explica la forma en que se pueden eliminar registros en nuestras tablas con instrucciones DELETE más complejas que las...

Últimos artículos

Factura Electrónica Costa Rica

Encabezados del XML Factura Electrónica Costa Rica 4.3

Para generar el XML de la factura electrónica de Costa Rica se debe de seguir un formato específico para que estas sean...
C# - PDF417

Crear código PDF417 con iTextSharp y XZing en C# .NET

Para crear códigos PDF417 existen herramientas que podemos agregar a nuestra aplicaciones. En este ejemplo vamos explicar como utilizar iTextSharp y ZXing.

SQL Server: Error 3414, servicio no inicia

El error 3414 se produce generalmente cuando el motor de la base de datos SQL Server sufre algún evento imprevisto. Aquí lo solucionamos.
C# String Base64

Convertir String a Base64

Hemos tenido algunas consultas en estos días de cómo convertir Texto String a Base64 y viceversa, ahora por el tema de "Factura Electrónica", entonces decidimos hacer este pequeño ejemplo.