2017-10-17 38 views
2

Je travaille sur un package SSIS qui sera utilisé pour importer des données d'un fichier Excel dans SQL Server. Mon combat actuel consiste à trouver comment faire en sorte que le paquet SSIS apporte exactement un fichier Excel sans en connaître le nom au préalable. J'ai un répertoire qui contiendra entre 0 et n fichiers Excel en même temps. Je veux seulement rentrer le fichier avec le temps de création le plus ancien. Est-ce possible? J'utilise Visual Studio 2015 pour générer le package SSIS. Mon DB est dans SQL Server 2016.Importer des données à partir d'Excel à l'aide de SSIS sans connaître le nom du fichier

Répondre

1

Pour créer une connexion dynamique de fichiers:

  1. Créer une nouvelle variable (nom Exemple: 'SourceFile') de chaîne de type de données.

  2. Dans une carte 'For Each Loop Container', mettez cette variable sous l'onglet 'Variable Mapping' et définissez la 'Configuration de l'énumérateur' sur l'extension de dossier et de fichier appropriée. Le 'For Each Loop Container' lit le fichier à partir de l'emplacement et affecte le nom du fichier à la variable.

  3. Dans les expressions Propriétés de connexion de fichiers définissez la propriété ConnectionString à @ [User :: SourceFile]

Cela devrait rendre votre fichier source dynamique. Il ramassera le fichier quel que soit son nom, mais le format du fichier devra être cohérent. En utilisant uniquement des tâches SSIS, je ne sais pas comment utiliser la date de création des fichiers pour sélectionner le fichier le plus ancien, mais si le nom de fichier contient la date de création du fichier, vous pouvez soustraire la date à @ [ User :: SourceFile] variable et stockez-la dans une autre variable à chaque exécution du 'For Each Loop Container' pour déterminer quel fichier est le plus ancien.

+0

Merci pour votre réponse. Le problème que j'ai est que je veux seulement apporter un seul fichier à la fois, pas tous les fichiers dans le dossier. Si je fais cela, le paquet n'apportera-t-il pas tous les fichiers à cet endroit? –

+0

Si aucune autre tâche ne se trouve dans la boucle For Each, elle lira uniquement le nom du fichier et l'affectera à @ [User :: SourceFile]. Il ne déplacera aucun fichier ou n'effectuera aucune autre tâche à moins que vous ne mettiez ces tâches dans la boucle. Vous pouvez utiliser la boucle pour déterminer uniquement le nom du fichier le plus ancien et une fois que vous connaissez le nom du fichier le plus ancien, affectez cette valeur à une autre variable (exemple: @ [User :: SourceFileMaxCreateDate]) et utilisez cette nouvelle variable dans ConnectionString propriété de la connexion de fichier –

+0

Huh. Cela ne m'est pas venu à l'esprit. Merci! –