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.

Archivado en:
Comparte este post:

Comentarios

# Ibon Landa said:

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.

Thursday, July 19, 2007 6:13 PM
# Jesus Javier Torres Posadas said:

Hola que tal estoy desarrollando una aplicacion en VB .Net 2005 y con sql server 2000 por medio de OLEdb, y quisiera insertar una imagen o colsultarla, pero aun no puedo, espero puedas auxiliarme. Gracias

javier_shark76@hotmail.com

Saturday, August 11, 2007 8:53 PM
# Carlos Montes said:

A mi el consejo me ha sido de utilidad, no tengo SQL Server 2005 y no encontraba información para generar números aleatorios.

Muchas gracias

Saturday, November 24, 2007 6:28 PM
# camilo said:

Muchas gracias me sirvio mucho!

Tuesday, February 12, 2008 4:16 PM
# alejo said:

buena la solucion, gracias...

Thursday, July 03, 2008 5:41 PM
# Adriana said:

Excelente aportación, me sirvio mucho para realizar una generación de contraseñas. Muchisimas Gracias Jose!!!!

Thursday, February 19, 2009 11:52 PM
# Arturo said:

Muchas gracias, en verdad me saco de un apuro enorme. te lo agredesco

Monday, March 30, 2009 10:22 PM
# José Pablo Cárdenas said:

Buenas alguien sabe como hacer esto mismo para Sybase 12.5

Friday, November 20, 2009 9:25 PM
# Andres said:

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.

Thursday, March 11, 2010 4:48 PM
# Emanuel said:

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!

Wednesday, March 31, 2010 8:06 PM
# Rogelio said:

Muchas Gracias me ayudo mucho

Saludos

Tuesday, June 15, 2010 3:02 AM
# Diego said:

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

Wednesday, April 27, 2011 4:43 PM