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:
Gracias, me sirvio de mucho
Gerardo
Muy Buena Aplicacion...
a mi tbn me sirvio de Mucho. Gracias
Salu2.
Muchas gracias, muy buen trabajo, y gracias por compartir tus conocimientos.
Gracias en verdad, me sacaste de un problema grande =)
muy buen dato hermano, te agradesco justo necesitaba eso
Estubo bueno!. pero hay alguno para campos image?
y Para campos image?
el link está roto :(
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.
Anonimo: tal vez el problema sea el seteo numérico de windows. Tal vez si usas coma (,) para separador decimal funcione bien.
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)
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.
Aún no lo he probado pero por los comentarios es perfecto para lo que estoy buscando. Muchas gracias por el aporte.
Excelente aplicacion.
Me sirvió de mucho
muy buen blog.
saludos y gracias.
Muy Buena Aplicacion...
muchisimas gracias me salvaste la vida.
Salu2.
Publicar un comentario