VicenteSabuco.com

Registros aleatorios en SQL con newid()

Aunque SQL dispone de la función RAND() para generar números aleatorios su uso es limitado. Por ejemplo, si lo ejecutamos varias veces en una misma transacción, siempre nos devolverá el mismo valor. Con lo que, si queremos devolver un valor aleatorio en cada fila de una consulta, no podemos usarlo.

Una opción más potente que el RAND() para generar valores aleatorios es la utilización de la función NEWID() de SQL. NEWID() nos devuelve una cadena larga basada en la MAC de la tarjeta de red y el reloj del sistema. Este sí será un valor aleatorio más útil, ya que obtendremos un valor distinto en cada llamada a NEWID() aunque sea en la misma transacción. Pongamos como ejemplo que queremos devolver un registro aleatorio de una tabla, lo podríamos hacer con esta sentencia:

Con esto obtendríamos el primer registro pero de un listado con orden aleatorio. Lógicamente, si quitamos el TOP 1 de la sentencia, obtendríamos el listado aleatorio completo. Y si volvemos a ejecutar la sentencia, el mismo listado pero con un orden diferente al obtenido en la anterior ejecución.

Si por algún motivo necesitamos generar en SQL un número aleatorio. Podemos transformar el resultado de la función NEWID() en un entero con la función CHECKSUM de la siguiente manera:

Esta sentencia puede devolver en algún caso números negativos, esto lo solucionamos utilizando la función abs que nos devuelve el valor absoluto:

Y si queremos limitar el valor de este número aleatorio, utilizamos el resto de la división entera (%) como en otros lenguajes de programación:

Con esta última sentencia obtenemos un valor aleatorio entre 0 y 9 en SQL.

[Total:1    Promedio:5/5]

Artículos relacionados

Sobre el autor Ver todos los posts Web del autor

Jose Emeterio

Consultor SEO y experto en analítica Web, se algo de Wordpress, fotografía y tecnología en general. Cuando quiero desconectar suelo viajar y cocinar.

Deja un comentario

Tu dirección de email no será publicada. Los campos obligatorios están marcados con *