Esta parece fácil pero no lo es tanto. Imagínate que tienes que meter valores aleatorios dentro de un campo de una tabla para todos los registros de ésta. Por ejemplo, le vamos a asignar un número aleatorio como pin de acceso inicial a cada usuario de nuestra base de datos y éste debe estar entre 1 y 100.000 (Vale, el ejemplo es un poco chorrada, pero se capta la idea). Queremos actualizar los miles de registros de nuestra base de datos y asegurarnos de que cada uno recibe un valor aleatorio en el campo correspondiente.

Lo primero que salta a la mente para intentar es esto:

UPDATE Usuarios Set pin = Round(((100000) * Rand() + 1

Es decir, usamos la función RAND para obtener un valor aleatorio dentro del rango especificado. Parece correcto ¿no?

Si lo ejecutamos nos llevaremos una sorpresa: todos los registros se quedan con el mismo valor. :-(

Pero ¿no era aleatorio?. Sí. El problemilla es que RAND se evalúa sólo una vez para el proceso completo, y se inserta sólo un valor. No nos vale...

La solución correcta

Bueno, esto es lo que tuve que hacer al final:

UPDATE Usuarios Set pin = ABS(CAST(NEWID() as binary(6)) % 100000) + 1

¿jaaarl? Pues nada lo que se hace es utilizar la función NEWID que genera un nuevo valor aleatorio de tipo GUID (ya se sabe, aleatoriedad al máximo) y convertir éste a un tipo binario de 6 bytes (explicación en http://technet.microsoft.com/es-es/library/ms191530.aspx) y devolvemos el resto de dividirlo por el número objetivo, en valor absoluto. El resto siempre nos va a devolver como máximo el número objetivo menos 1 8en el peor de los casos), así que ya tenemos la prueba conseguida :-) Le sumamos 1 para que nunca nos de 0.

Listo. Espero que a alguien le pueda sacar de un apuro en un momento dado.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA