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

15 comentarios:

Anónimo dijo...

Gracias, me sirvio de mucho
Gerardo

Anónimo dijo...

Muy Buena Aplicacion...
a mi tbn me sirvio de Mucho. Gracias
Salu2.

Anónimo dijo...

Muchas gracias, muy buen trabajo, y gracias por compartir tus conocimientos.

Anónimo dijo...

Gracias en verdad, me sacaste de un problema grande =)

ZIZOU dijo...

muy buen dato hermano, te agradesco justo necesitaba eso

Anónimo dijo...

Estubo bueno!. pero hay alguno para campos image?

Anónimo dijo...

y Para campos image?

Anónimo dijo...

el link está roto :(

Anónimo dijo...

Muy bueno, sólo tengo un problema
si entre los campos de la tabla tengo un campo con decimales al ejecutar me sale el siguiente error:
INSERT INTO ALI(AliCod,AliNom,AliPor) VALUES (24,'RG 140 ',1,0000)
Hay menos columnas en la instrucción INSERT que valores en la cláusula VALUES. El número de valores de VALUES debe coincidir con el de columnas de INSERT.

es como que el valor "1,0000" lo toma como 2 values diferentes.

Damián Bacalov dijo...

Anonimo: tal vez el problema sea el seteo numérico de windows. Tal vez si usas coma (,) para separador decimal funcione bien.

Anónimo dijo...

Si, fue lo primero que probe, pero igualmente sigue generando la sentencia con "," y no con "." en los campos numéricos:
Genera esto:
INSERT INTO ALI(AliCod,AliNom,AliPor) VALUES (24,'RG 140 ',1,0000)
Y lo que estaría necesitando es esto:
INSERT INTO ALI(AliCod,AliNom,AliPor) VALUES (24,'RG 140 ',1.0000)

Damián Bacalov dijo...

Bueno, de todas formas verás que el código es bastante sencillo. Podrías agregar una línea para hacer el reemplazo que necesitas.

Barandiaran dijo...

Aún no lo he probado pero por los comentarios es perfecto para lo que estoy buscando. Muchas gracias por el aporte.

caiman dijo...

Excelente aplicacion.

Me sirvió de mucho

muy buen blog.

saludos y gracias.

cristhian dijo...

Muy Buena Aplicacion...
muchisimas gracias me salvaste la vida.

Salu2.