sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo asignar columnas de entrada y salida dinámicamente en SSIS?

Si crea una tabla similar, puede usarla en 2 enfoques para asignar columnas dinámicamente dentro del paquete SSIS, o debe compilar todo el paquete mediante programación. En esta respuesta, intentaré brindarle algunas ideas sobre cómo hacerlo.

(1) Comando SQL fuente de creación con alias

Nota:este enfoque solo funcionará si todos los archivos .dbf tienen el mismo número de columnas pero los nombres son diferentes

En este enfoque, generará el comando SQL que se usará como fuente en función del ID de archivo y la tabla de asignación que creó. Debe saber que el ID de archivo y la ruta del archivo .dbf están almacenados dentro de una variable. como ejemplo:

Suponiendo que el nombre de la tabla es inputoutputMapping

Agregue una tarea Ejecutar SQL con el siguiente comando:

DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT '

SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?

SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))

SELECT @strQuery

Y en la pestaña Asignación de parámetros, seleccione la variable que contiene el ID de archivo que se asignará al parámetro 0 y la variable que contiene el nombre del archivo .dbf (alternativa al nombre de la tabla) al parámetro 1

Establezca el tipo de ResultSet en Single Row y almacenar el ResultSet 0 dentro de una variable de tipo cadena como ejemplo @[User::SourceQuery]

El valor de ResultSet será el siguiente:

SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1

En el OLEDB Source seleccione el Modo de acceso a la tabla para el comando SQL desde Variable y use @[User::SourceQuery] variable como fuente.

(2) Uso de un componente de secuencia de comandos como fuente

En este enfoque, debe usar un componente de secuencia de comandos como fuente dentro de la tarea de flujo de datos:

En primer lugar, debe pasar la ruta del archivo .dbf y la conexión de SQL Server al componente de secuencia de comandos a través de variables si no desea codificarlas.

Dentro del editor de secuencias de comandos, debe agregar una columna de salida para cada columna encontrada en la tabla de destino y asignarlas al destino .

Dentro del Script, debe leer el archivo .dbf en una tabla de datos:

  • C# Leer desde archivos .DBF a una tabla de datos
  • Cargar un DBF en un DataTable

Después de cargar los datos en una tabla de datos, llene también otra tabla de datos con los datos encontrados en MappingTable que creó en SQL Server.

Después de eso, recorra las columnas de la tabla de datos y cambie el .ColumnName a la columna de salida relevante, como ejemplo:

foreach (DataColumn col in myTable.Columns)
    {

    col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First(); 

    }

Después de recorrer cada fila en la tabla de datos y crear una fila de salida de secuencia de comandos.

Además, tenga en cuenta que al asignar filas de salida, debe verificar si la columna existe, primero puede agregar todos los nombres de las columnas a la lista de cadenas y luego usarlo para verificar, como ejemplo:

var columnNames = myTable.Columns.Cast<DataColumn>()
                             .Select(x => x.ColumnName)
                             .ToList();  


foreach (DataColumn row in myTable.Rows){

if(columnNames.contains("CustCode"){

    OutputBuffer0.CustCode = row("CustCode");

}else{

    OutputBuffer0.CustCode_IsNull = True

}

//continue checking all other columns

}

Si necesita más detalles sobre el uso de un componente de secuencia de comandos como fuente, consulte uno de los siguientes enlaces:

  • Componente de secuencia de comandos de SSIS como origen
  • Creación de una fuente con el componente de secuencia de comandos
  • Componente de secuencia de comandos como origen:SSIS
  • SSIS:USO DE UN COMPONENTE DE GUIÓN COMO FUENTE

(3) Construyendo el paquete dinámicamente

No creo que haya otros métodos que pueda usar para lograr este objetivo, excepto que tiene la opción de crear el paquete de forma dinámica, entonces debería elegir:

  • BIML
  • Modelo de objetos gestionados de Integration Services
  • Biblioteca EzApi

(4) SchemaMapper:biblioteca de clases de asignación de esquemas de C#

Recientemente comencé un nuevo proyecto en Git-Hub, que es una biblioteca de clases desarrollada con C#. Puede usarlo para importar datos tabulares de Excel, Word, PowerPoint, texto, csv, html, json y xml en la tabla del servidor SQL con una definición de esquema diferente utilizando el enfoque de asignación de esquema. compruébalo en:

  • SchemaMapper:biblioteca de clases de asignación de esquemas de C#

Puede seguir esta página Wiki para obtener una guía paso a paso:

  • Guía paso a paso para importar datos de múltiples archivos a una tabla SQL