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