Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment mapper dynamiquement les colonnes d'entrée et de sortie dans SSIS ?

Si vous créez une table similaire, vous pouvez l'utiliser dans 2 approches pour mapper dynamiquement les colonnes dans le package SSIS, ou vous devez créer l'ensemble du package par programmation. Dans cette réponse, je vais essayer de vous donner quelques idées sur la façon de procéder.

(1) Construire une commande SQL source avec des alias

Remarque :Cette approche ne fonctionnera que si tous les fichiers .dbf ont le même nombre de colonnes mais que les noms sont différents

Dans cette approche, vous générerez la commande SQL qui sera utilisée comme source en fonction du FileID et de la table de mappage que vous avez créée. Vous devez savoir si le FileID et le chemin du fichier .dbf sont stockés dans une variable. par exemple :

En supposant que le nom de la table est inputoutputMapping

Ajoutez une tâche d'exécution SQL avec la commande suivante :

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

Et dans l'onglet Mappage des paramètres, sélectionnez la variable qui contient le FileID à mapper au paramètre 0 et la variable qui contient le nom du fichier .dbf (alternative au nom de la table) au paramètre 1

Définissez le type de ResultSet sur Single Row et stocker le ResultSet 0 à l'intérieur d'une variable de type chaîne comme exemple @[User::SourceQuery]

La valeur ResultSet sera la suivante :

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

Dans le OLEDB Source sélectionnez le mode d'accès à la table pour la commande SQL à partir de la variable et utilisez @[User::SourceQuery] variable comme source.

(2) Utilisation d'un composant de script comme source

Dans cette approche, vous devez utiliser un composant de script comme source dans la tâche de flux de données :

Tout d'abord, vous devez transmettre le chemin du fichier .dbf et la connexion SQL Server au composant de script via des variables si vous ne souhaitez pas les coder en dur.

Dans l'éditeur de script, vous devez ajouter une colonne de sortie pour chaque colonne trouvée dans la table de destination et les mapper à la destination .

Dans le script, vous devez lire le fichier .dbf dans une table de données :

  • C# Lire des fichiers .DBF dans une table de données
  • Charger un DBF dans un DataTable

Après avoir chargé les données dans un tableau de données, remplissez également un autre tableau de données avec les données trouvées dans le MappingTable que vous avez créé dans SQL Server.

Après cette boucle sur les colonnes de la table de données et modifiez le .ColumnName à la colonne de sortie appropriée, par exemple :

foreach (DataColumn col in myTable.Columns)
    {

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

    }

Après avoir parcouru chaque ligne de la table de données et créer une ligne de sortie de script.

De plus, notez que lors de l'attribution des lignes de sortie, vous devez vérifier si la colonne existe, vous pouvez d'abord ajouter tous les noms de colonnes à la liste de chaînes, puis l'utiliser pour vérifier, par exemple :

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 vous avez besoin de plus de détails sur l'utilisation d'un composant de script comme source, consultez l'un des liens suivants :

  • Composant de script SSIS comme source
  • Création d'une source avec le composant de script
  • Composant de script en tant que source – SSIS
  • SSIS - UTILISATION D'UN COMPOSANT DE SCRIPT COMME SOURCE

(3) Construire le package dynamiquement

Je ne pense pas qu'il existe d'autres méthodes que vous puissiez utiliser pour atteindre cet objectif, sauf que vous avez le choix de créer le package de manière dynamique, alors vous devriez choisir :

  • BIML
  • Modèle d'objet géré d'Integration Services
  • Bibliothèque EzApi

(4) SchemaMapper :bibliothèque de classes de mappage de schéma C#

Récemment, j'ai démarré un nouveau projet sur Git-Hub, qui est une bibliothèque de classes développée en C#. Vous pouvez l'utiliser pour importer des données tabulaires à partir d'excel, word, powerpoint, text, csv, html, json et xml dans la table du serveur SQL avec une définition de schéma différente en utilisant l'approche de mappage de schéma. consultez-le sur :

  • SchemaMapper :bibliothèque de classes de mappage de schéma C#

Vous pouvez suivre cette page Wiki pour un guide étape par étape :

  • Importer des données de plusieurs fichiers dans une table SQL guide étape par étape