Generar datos de prueba para SQL Server

·5 min de lectura·

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

SQL SERVERMuchas veces cuando empezamos a desarrollar un nuevo proyecto o hacemos un determinado mantenimiento a una aplicación de base de datos, necesitamos precisamente eso: datos de prueba para empezar a trabajar. Lo más simple es agregar algunos registros a nuestras tablas y probar, pero seguro que en breve no serán  suficientes y necesitaremos más datos, ya sea para pruebas de velocidad y rendimiento, filtros, paginación, etc.

Existen herramientas de terceros que permiten generar datos aleatorios, pero son productos caros y no siempre es factible adquirirlos. Entonces, ¿cómo podemos generar esos datos de prueba en nuestras propias bases de datos?.

Solución

Os mostraré algunos trucos para generar datos aleatorios a partir de unos cuantos registros y multiplicarlos por miles. Cada tipo de datos necesita un enfoque diferente como se puede ver a continuación.

Datos Numéricos

En primer lugar, sin duda necesitaremos generar algunos datos numéricos. Lo primero que se nos ocurriría a priori es usar la función RAND(). Desafortunadamente esta función se invoca una sola vez por consulta, no una vez por cada fila, por lo tanto, devuelve el mismo valor para cada registro afectado por la consulta. Así que sugiero el uso de otros métodos, a menos que se desea utilizar un valor de inicialización distinto para cada llamada, que puede ser muy trabajoso para la generación de un volumen masivo de datos.

Lo mejor para obtener un valor aleatorio real, es usar la función NEWID () junto con la función CHECKSUM(). La siguiente expresión devuelve un valor entero aleatorio:

SELECT CHECKSUM(NEWID())

Esto devuelve un número entero positivo o negativo, pero podemos hacer una modificación para que devuelva valores positivos y decimales, si es lo que necesitamos.

SELECT ABS(CHECKSUM(NEWID()))/100.0

Por supuesto esta expresión es aplicable para agregar o modificar un registro. Por ejemplo la siguiente sentencia agregaría un nuevo registro y se puede ejecutar cuantas veces sea necesario para generar muchos registros:

INSERT INTO \[dbo\].\[TablaPrueba\]
           (\[ENTERO\],
            \[DECIMAL\])
     VALUES
           (ABS(CHECKSUM(NEWID())),
            ABS(CHECKSUM(NEWID()))/100.0)

Después de ejecutar la sentencia varias veces podemos consultar los datos:

SELECT \[ENTERO\], \[DECIMAL\]
    FROM \[dbo\].\[TablaPrueba\]
![SQL SELECT](/images/1/files/2014/05/image1.png "SQL SELECT")

La siguiente instrucción actualiza registros existentes en lote, cada registro tendría valores distintos:

UPDATE \[dbo\].\[TablaPrueba\]
   SET \[DECIMAL\] = ABS(CHECKSUM(NEWID()))/100.0

Datos de Texto

Es posible usar la misma función NEWID(), para generar textos. La siguiente sentencia devolverá un valor aleatorio algo así como: 4F9008A9-BA3D-4077-A17E-724E2AF962AD.

SELECT CONVERT(VARCHAR(MAX),NEWID())

Sin embargo como se puede ver generará textos basados en letras y números que no tendrán un significado especial. Los datos de texto requieren especial atención,  si se desea tener una base de datos con un cierto contenido razonable. Lo primero que se debería hacer es construir un diccionario inicial y luego utilizarlo para generar más filas. Por ejemplo, es común el uso de nombres en varios campos de la base de datos. El siguiente ejemplo muestra cómo crear una tabla que contendrá 100 nombres diferentes en pocos segundos.

\-- Crear Tabla para Nombres 
CREATE TABLE \[NOMBRES\] (NOMBRE \[varchar\](20))  
\-- Crear Tabla para Apellidos 
CREATE TABLE \[APELLIDOS\] (APELLIDO \[varchar\](20))  
\-- Llenar algunos nombres
INSERT INTO NOMBRES VALUES ('Juan')  
INSERT INTO NOMBRES VALUES ('Carlos')  
INSERT INTO NOMBRES VALUES ('Pablo')  
INSERT INTO NOMBRES VALUES ('María')  
INSERT INTO NOMBRES VALUES ('Enrique')  
INSERT INTO NOMBRES VALUES ('Jorge')  
INSERT INTO NOMBRES VALUES ('Luis')  
INSERT INTO NOMBRES VALUES ('Raúl')  
INSERT INTO NOMBRES VALUES ('Sofia')  
INSERT INTO NOMBRES VALUES ('Jesús')  
\-- Llenar algunos apellidos  
INSERT INTO APELLIDOS VALUES ('Arias')  
INSERT INTO APELLIDOS VALUES ('Pérez')  
INSERT INTO APELLIDOS VALUES ('Pinto')  
INSERT INTO APELLIDOS VALUES ('Sánchez')  
INSERT INTO APELLIDOS VALUES ('Herrera')  
INSERT INTO APELLIDOS VALUES ('Rojas')  
INSERT INTO APELLIDOS VALUES ('Poma')  
INSERT INTO APELLIDOS VALUES ('Redondo')  
INSERT INTO APELLIDOS VALUES ('Tapia')  
INSERT INTO APELLIDOS VALUES ('Gil')  
\-- Generar 10x10=100 nombres diferentes  
SELECT \* INTO TESTTABLE FROM NOMBRES CROSS JOIN APELLIDOS

Con los ejemplos anteriores se pueden generar rápidamente más y más registros diferentes para unas cuantas tablas de una base de datos, para así tener datos de prueba al momento de implementar una aplicación. El uso de  los CROSS JOIN Y SELF JOIN pueden crear fácilmente gran cantidad de datos así que se debería tener cuidado al utilizar tablas muy grandes o con muchos datos.

Si quieres más trucos de este tipo te invito a echarle un vistazo a este Nuevo libro de SQL Server 2014 en Español

Comprar en AmazonSQL Server 2014 | Amazon Kindle

Comprar en Google PlaySQL Server 2014 | Google Play Books

Comentarios (0)

Sé el primero en comentar.

T-SQL: Re-Indexar todas las tablas de una Base de Datos

·1 min de lectura

El artículo explica cómo re‑indexar todas las tablas de una base de datos SQL Server cuando no existe un comando único para ello. Se presenta un script TSQL que recorre el catálogo de datos, obtiene los nombres de todas las tablas base y ejecuta DBCC DBREINDEX para cada una, evitando mensajes de información. El cursor se cierra y libera al finalizar. El autor sugiere que el código sea útil y menciona un libro de SQL Server 2014 en español como recurso adicional.

Instalando SQL Server en Linux

·3 min de lectura

Microsoft lanzó una versión de SQL Server para Linux, lo que permite a los administradores instalar, usar y mantener el motor en sistemas como Red Hat Enterprise Linux 7, CentOS 7 y Ubuntu 16.04 64 bits. Se requiere al menos 4 GB de RAM. El proceso en Ubuntu implica agregar la clave GPG, añadir el repositorio, actualizar paquetes, instalar dependencias y ejecutar el script de configuración, aceptando los términos de licencia. Una vez instalado, se puede conectar con la línea de comandos, crear bases de datos y usar los mismos comandos que en Windows.