Cómo insertar valores aleatorios en una base de datos SQL Server

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.

Sin categoría

12 thoughts on “Cómo insertar valores aleatorios en una base de datos SQL Server

  1. Hola,

    Una de las caracteristicas interesantes de VStudio Database Professional es poder generar datos de ejemplo para una base de datos. Esta característica también viene muy bien para poder hacer pruebas.

  2. Muy util lo de los numeros aleatorios, Gracias!!
    Para lo de insertar imagenes recomiendo insertar en la base de datos la direccion donde se encuentra la imagen y de ahi cargar las imagenes en la aplicacion. Esto hace que la base de datos no se haga muy pesada.

  3. Muchisimas Graciassss!!!!

    me ahorraste muchisimo trabajo ya que no encontraba función que me hiciera esto, y cuando traté de hacerlo por mi cuenta, me sucedio lo que pusiste en el ejemplo!

    graciasss! sos un capo!

  4. Estimados, probe tu funcion y se me repitieron alguos datos, asi es que revisen antes de ejecutarlos, ya que tal vez querran numeros unicos, Saludos

Deja un comentario

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