none
Exportacion masiva de tablas a csv RRS feed

  • Pregunta

  • Que tal a todos,

    Estoy tratando de armar un paquete con SSIS, para exportar ciertas tablas de mi base de datos Sql a .csv

    Se que puedo usar el asistente de importación y exportación que ofrece el propio gestor de Sql, pero la idea es automatizar estas tareas, es decir armar el paquete SSIS y despues ejecutarlo con un boton desde alguna interfaz. El problema que tengo de primera instancia es que solo puedo exportar una tabla con SSIS, pense en armar varios OleDb con diferentes FlatFile Destination, pero cuando trato de configurar otro FaltFileDestination este me sobre escribe el anterior y no puedo avanzar. O tengo que armar un paquete por cada OleDb y tener un paquete por cada tabla que deseo exportar a csv?

    Este es el paquete que estoy tratando de armar, sin exito:

    package

    Tambien trate de usar la herramienta de BimlExpress, encontre este enlace:

    Bimlscript

    Cambie la cadena de conexion por la mia, pero me aparece un error donde indica que no puede conectar con la instancia Sql.

    <#@ template language="C#" hostspecific="true"#>
    <#@ import namespace="System.Data"#>
    <#@ import namespace="System.Data.SqlClient"#>
    <#@ import namespace="System.IO"#>
    <#@ import namespace="Varigence.Hadron.CoreLowerer.SchemaManagement" #>
    <# var connection = SchemaManager.CreateConnectionNode("SchemaProvider", "Data Source=(local);Initial Catalog=ChampionValleyPens;Provider=SQLNCLI11.1;Integrated Security=SSPI;"); #>
    <# var tables = connection.GenerateTableNodes("Orders"); #>
    	
    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
        <Annotations>
            <Annotation>
                Creates one package per table within the specified schema with a flat file connection manager configured based on database metadata
    			Adapted from a file export routine develped by John Minkjan.
    			You can split the FileFormats and Connections nodes into separate files as I've done for modularity.
    			Relies on SQL Server 2008+ CTE functionality
                Support: Tested in BIDSHelper 1.6, but should work in BIDSHelper 1.5, Mist 2.x, and Mist 3.x
    			Author: Michael Hotek
    			Company: Champion Valley Software, Inc.
    			Contact: mhotek@mssqlserver.com or http://www.ChampionValleyPress.com
            </Annotation>
        </Annotations>
    	<#
    		string CnSrcDB = "Server=(local);Initial Catalog=ChampionValleyPens;Integrated Security=SSPI;Provider=SQLNCLI11.1";
    		string TableName ="";
    		string ColumnName ="";
    		string DataType ="";
    		string ColumnDelimeter =";";
      		string SchemaName="Orders";
    		string ExcludeCols="'LoadID','StageLoadID','SourceDB'";
    		string MaxLength="";
    		string Precision="";
    		string Scale="";
    		string RowNumber="";
    		string MaxColumns="";
    		DataTable Cols;
    	#>
    	<FileFormats>
    		<# foreach (var table in tables) { #>
    		<FlatFileFormat FlatFileType="Delimited" ColumnNamesInFirstDataRow="true" RowDelimiter="CRLF" Name="<#=table.Name#>">
    			<Columns>
    				<# Cols = ExternalDataAccess.GetDataTable(CnSrcDB,"WITH Schema_CTE (TableName, ColumnName, BimlType, MaxLength, Precision, Scale, " +
    					"RowNumber) AS (SELECT OBJECT_NAME(object_id), a.name, c.BimlType, a.max_length, a.precision, a.scale, " + 
    					"ROW_NUMBER () OVER(PARTITION BY OBJECT_NAME(object_id) ORDER BY a.column_id) RowNum FROM sys.columns a " + 
    					"INNER JOIN sys.types b ON a.system_type_id = b.system_type_id LEFT OUTER JOIN (VALUES ('nvarchar','String'), " + 
    					"('nchar','String'), ('varchar','AnsiString'), ('char','AnsiString'), ('int','Int32'),('smallint','Int16'), " + 
    					"('tinyint','Int16'),('bigint','Int64'),('datetime','DateTime'),('money','Currency'), ('float','Double'), " + 
    					"('decimal','Decimal'), ('uniqueidentifier','GUID'), ('date','Date'), ('time','Time'), ('binary','Binary'), " + 
    					"('datetime2','DateTime2'), ('datetimeoffset','DateTimeOffset'), ('smalldatetime','DateTime'), ('real','Double'), " + 
    					"('bit','Boolean'), ('numeric','Decimal'), ('smallmoney','Currency'), ('sql_variant','String'), ('hierarchyid','String'), " + 
    					"('geometry','String'), ('geography','String'), ('varbinary','Binary'), ('timestamp','String'), ('xml','XML')) " + 
    					"AS c(SQLType,BimlType) ON b.name = c.SQLType WHERE OBJECT_SCHEMA_NAME(object_id) = '"+SchemaName+"' AND b.name != 'sysname' " + 
    					"AND a.Name NOT IN ("+ExcludeCols+") AND OBJECT_NAME(object_id) = '"+table.Name+"') SELECT ColumnName, BimlType, " + 
    					"CASE WHEN BimlType != 'String' THEN 0 ELSE MaxLength END MaxLength, CASE WHEN BimlType != 'Decimal' THEN 0 ELSE Precision END " + 
    					"Precision, Scale, RowNumber, MAX(RowNumber) OVER(PARTITION BY TableName) MaxColumn FROM Schema_CTE");
    					foreach (DataRow Row in Cols.Rows){
    						ColumnName=Row[0].ToString();
    						DataType=Row[1].ToString();
    						MaxLength=Row[2].ToString();
    						Precision=Row[3].ToString();
    						Scale=Row[4].ToString();
    						RowNumber=Row[5].ToString();
    						MaxColumns=Row[6].ToString();
     						ColumnDelimeter = ";";
    						if (RowNumber == MaxColumns){ ColumnDelimeter = "CRLF"; } ;
    				#>
    					<Column Name="<#=ColumnName#>" ColumnType="Delimited" DataType= "<#=DataType#>" Delimiter="<#=ColumnDelimeter#>" Length="<#=MaxLength#>" Precision="<#=Precision#>" Scale="<#=Scale#>"></Column>
    				<# } #>
    			</Columns>
    		</FlatFileFormat>
    		<#}  #>
    	</FileFormats>
        <Connections>
            <OleDbConnection
                Name="CnOleDBAdventureWorks2012"
                ConnectionString="Data Source=(local);Initial Catalog=ChampionValleyPens;Provider=SQLNCLI10.1;Integrated Security=SSPI;Connect Timeout=30;"
                RetainSameConnection="true">
            </OleDbConnection>
    		<# foreach (var table in tables) { #>
            <FlatFileConnection Name="<#=table.Name#>"
                    FileFormat="<#=table.Name#>"
                    FilePath="C:\\<#=table.Name#>.csv"></FlatFileConnection>          
                <# }#>
        </Connections>
        <Packages>
    		<# foreach (var table in tables) { #>
            <Package Name="<#=table.Name#>" ConstraintMode="Linear" FailParentOnFailure="false">
                <Tasks>
                    <Dataflow  Name="<#=table.Name#>">
                        <Transformations>
                            <FlatFileSource Name="<#=table.Name#>"
                                ConnectionName="<#=table.Name#>"></FlatFileSource>
                        </Transformations>
                    </Dataflow>
                </Tasks>
            </Package>
    			
            <# } #>
    			
        </Packages>
    </Biml>

    El provedor Sql que estoy usando es el  SQLNCLI11.1

    Es la primera vez que estoy usando SSIS, espero me puedan ayudar.

    Saludos

    DS


    Aprendiz de todos maestro de nadie. Saludos desde Cd. Juarez Chihuahua Mexico. DS.


    • Editado Dany Solis miércoles, 31 de marzo de 2021 15:35 Add link
    miércoles, 31 de marzo de 2021 15:34

Respuestas

  • Desde SSIS deberías poder hacer todas las exportaciones sin ningún problema.

    En el flujo de control, añade varios dataflows, uno por cada tabla. Si los conectas con restricciones de precedencia (flechas), se ejecutarán secuencialmente. Si no les pones flechas, se ejecutarán todos en paralelo (cosa que a lo mejor no te conviene porque puede que se vuelva lento al tener que saltar de una ubicación en disco a otra mientras graba a la vez todos los archivos).

    Dentro de cada uno de los flujos de datos, pon un origen de datos que lea la tabla por OleDb, y un destino a fichero plano. Asegúrate de que cada destino lo creas nuevo en lugar de reutilizar el destino anterior; de lo contrario se te van machacando cada vez que añades uno nuevo.

    • Marcado como respuesta Dany Solis miércoles, 31 de marzo de 2021 20:02
    miércoles, 31 de marzo de 2021 16:33

Todas las respuestas

  • Desde SSIS deberías poder hacer todas las exportaciones sin ningún problema.

    En el flujo de control, añade varios dataflows, uno por cada tabla. Si los conectas con restricciones de precedencia (flechas), se ejecutarán secuencialmente. Si no les pones flechas, se ejecutarán todos en paralelo (cosa que a lo mejor no te conviene porque puede que se vuelva lento al tener que saltar de una ubicación en disco a otra mientras graba a la vez todos los archivos).

    Dentro de cada uno de los flujos de datos, pon un origen de datos que lea la tabla por OleDb, y un destino a fichero plano. Asegúrate de que cada destino lo creas nuevo en lugar de reutilizar el destino anterior; de lo contrario se te van machacando cada vez que añades uno nuevo.

    • Marcado como respuesta Dany Solis miércoles, 31 de marzo de 2021 20:02
    miércoles, 31 de marzo de 2021 16:33
  • Muchas Gracias, Alberto lo he solucionado con tus apuntes puntuales.

    Saludos

    DS


    Aprendiz de todos maestro de nadie. Saludos desde Cd. Juarez Chihuahua Mexico. DS.

    miércoles, 31 de marzo de 2021 20:03