Para exportar datos de una tabla en Inserts en SQL Server, se puede hacer de manera más o menos intuitiva dependiendo del cliente que se utilice. En SQL Server Management Studio por ejemplo, se puede hacer desde el menú contextual, creando una tarea y seleccionando que sólo se desea exportar los datos y no la estructura de la tabla.
Una manera más sencilla y aplicable a todos los clientes de SQL Server, es mediante la siguiente función. Esta función, obtiene directamente las columnas de la tabla que le pasemos a través de las tablas diccionario, por lo que simplemente indicándole el nombre de la tabla a exportar, ya se obtiene los inserts que deberíamos ejecutar para importar los datos.
if exists (select * from sysobjects where id = object_id(N'[dbo].[sp_CreateDataLoadScript]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[sp_CreateDataLoadScript] GO CREATE PROCEDURE sp_CreateDataLoadScript @TblName varchar(128) as create table #a (id int identity (1,1), ColType int, ColName varchar(128)) insert #a (ColType, ColName) select case when DATA_TYPE like '%char%' then 1 else 0 end , COLUMN_NAME from information_schema.columns where TABLE_NAME = @TblName order by ORDINAL_POSITION if not exists (select * from #a) begin raiserror('No columns found for table %s', 16,-1, @TblName) return end declare @id int , @maxid int , @cmd1 varchar(7000) , @cmd2 varchar(7000) select @id = 0 , @maxid = max(id) from #a select @cmd1 = 'select '' insert ' + @TblName + ' ( ' select @cmd2 = ' + '' select '' + ' while @id < @maxid begin select @id = min(id) from #a where id > @id select @cmd1 = @cmd1 + ColName + ',' from #a where id = @id select @cmd2 = @cmd2 + ' case when ' + ColName + ' is null ' + ' then ''null'' ' + ' else ' + case when ColType = 1 then ''''''''' + ' + ColName + ' + ''''''''' else 'convert(varchar(20),' + ColName + ')' end + ' end + '','' + ' from #a where id = @id end select @cmd1 = left(@cmd1,len(@cmd1)-1) + ' ) '' ' select @cmd2 = left(@cmd2,len(@cmd2)-8) + ' from ' + @tblName select '/*' + @cmd1 + @cmd2 + '*/' exec (@cmd1 + @cmd2) drop table #a go
El script de creación está blidado, es decir, si ya existía esta función no dará error, ya que comprueba antes si ya existía.
Para ejecutarlo bastaría con lanzar lo siguiente:
exec sp_CreateDataLoadScript 'nombre_tabla'
Al ejecutarlo devuelve 2 cosas:
- La select que ha utilizado para generar los inserts, la cual si la ejecutamos nos devolverá las sentencias insert listas para ser ejecutadas.
- Las sentencias inserts en sí, con todos los datos. Es lo que devuelve al ejecutar la sentencia Select que también devuelve la función.