lunes, julio 31, 2006

Export SQL data in Insert statements

Cuando pasamos del ambiente de desarrollo al productivo muchas veces nos encontramos con la necesidad de crear nuevamente la base de datos y, junto con esta tarea, copiar los datos que deben estar precargados o de las tablas de relación.

Muchas veces, estas tablas, sólo tienen un par de registros. Crear un archivo CSV o crear un DTS resulta ser bastante engorroso.

Para estos casos es que hice esta simple página en ASP.NET para exportar los datos de una base MS Sql Server a sentencias del tipo insert.

Solución
Primero agregamos un campo para ingresar el Connection String correspondiente a la base de nuestro desarrollo. De esta forma traemos información de las tablas existentes (no de sistema).

Para no tener que ejecutar una sentencia COUNT(*) por cada tabla, consultamos a la tabla de sistema dbo.sysindexes para obtener los últimos datos estadísticos de cada tabla. Es importante entender que de esta forma obtendremos información sólo de las tablas que contengan algún indice o Primary Key y que esta información puede estar desactualizada. Aún así, tendremos una idea de cuantos registros tiene una tabla.

Debido a que el objetivo de esta página es crear un archivo de texto con las "sentencias insert" para ser ejecutado en un Query Analyzer, debemos poner un límite de cantidad de registros. Para este fin es que existe la variable MaxRows2Export. Arbitrariamente puse esta variable en 100.

Una vez seleccionadas las tablas que queremos exportar, se genera un archivo de texto con las sentencias insert adecuadas. Para que este script funcione debemos asegurarnos de que podemos insertar Identities. Por esta razón, cada bloque se inicia con un:
SET IDENTITY_INSERT table ON
y finaliza con un
SET IDENTITY_INSERT table OFF

El siguiente es un ejemplo de archivo de texto que genera esta aplicación considerando que seleccionamos la tabla "Status" y "Genders":
-- Status
SET IDENTITY_INSERT Status ON
GO
INSERT INTO Status(ID,Name) VALUES (1,'Pending')
INSERT INTO Status(ID,Name) VALUES (2,'Approved')
INSERT INTO Status(ID,Name) VALUES (3,'Disapproved')
GO
SET IDENTITY_INSERT Status OFF
GO

-- Genders
SET IDENTITY_INSERT Genders ON
GO
INSERT INTO Genders(GenderId,Gender) VALUES (1,'Male')
INSERT INTO Genders(GenderId,Gender) VALUES (2,'Female')

GO
SET IDENTITY_INSERT Genders OFF
GO

Espero que les sea útil. En el siguiente link encontrarán un ZIP que contiene sólo una página ASPX con esta aplicación.
sql2insert.zip