J'essaie d'archiver un ensemble de fichiers du chemin source vers un chemin d'archivage une fois que j'ai terminé de faire certains éléments de la tâche de flux de données. À l'intérieur d'un conteneur de boucles Foreach, j'ai: Tâche de script -> Tâche de flux de données -> Tâche d'exécution SQL -> Tâche du système de fichiers
J'ai une variable utilisateur définie sur l'élément "Nom et extension" sous les paramètres de collecte dans le conteneur de boucle Foreach. La variable est appelée "fileName" et est utilisée à la fois dans la tâche de script (utilisée pour analyser les informations du fichier et effectuer la tâche d'exécution SQL) ainsi que dans la tâche de flux de données dans le gestionnaire de connexion de fichiers plats qui est à son tour utilisée par l'élément Flat File Source. J'analyse ensuite le fichier et insère les données dans une base de données. Tout fonctionne comme il se doit jusqu'à ce que j'arrive à la tâche du système de fichiers (FST).
Ce que je voudrais, c'est que le fichier soit déplacé vers un dossier d'archives une fois son insertion terminée. En utilisant plusieurs liens en ligne ( ici , ici et ici ), j'ai ajouté différentes variables qui sont soit codées en dur, soit dérivées du massage d'autres variables. Dans tous les cas, ce qui se passe, c'est que sur le FST, j'obtiens des erreurs comme "caractères invalides dans le chemin" ou "chemin inconnu". Si j'essaie de masquer les exemples liés ci-dessus pour l'adapter à la structure de mon système de fichiers, j'obtiens maintenant une erreur à l'étape de source de fichier plat dans la tâche de flux de données indiquant qu'il ne peut pas trouver le fichier spécifié. Cela est dû au fait qu'il a) ne peut pas trouver le chemin d'accès au fichier car aucun chemin de fichier n'est donné, juste le nom de fichier.ext b) ne peut pas analyser la variable qui contient le chemin d'accès complet au fichier source (@FullSourcePathFileName
dont la valeur est définie sur @[User::SourcePath]
+ @[User::fileName]
)
J'ai testé d'autres modifications diverses, y compris faire exactement ce qui est dans le premier exemple que j'ai publié (mais celui-ci ne fait rien pour la tâche de flux de données, j'ai donc ajouté une étape de source de fichier plat sans destination) et j'ai reçu le même ensemble d'erreurs . Je suis désemparé ici et j'aimerais avoir des commentaires sur la façon de résoudre ce problème.
EDIT: Semble qu'il continue d'échouer sur le FullArchivePathFileName
- il n'évalue jamais l'expression même si je l'ai définie sur 'True'. Toujours confus quant à la raison pour laquelle il ne l'évalue pas. J'ai donc rendu son expression identique à FullSourcePathFileName
et vérifié que l'indicateur EvaluateAsExpression est défini sur True. Il n'évalue toujours pas cette variable. La variable FullSourcePathFileName
est bien évaluée.
Exemple suivant créé dans SSIS 2005
lit les fichiers CSV d'un dossier donné et insère des données dans une table SQL. Après avoir importé des données dans SQL, les fichiers sont ensuite déplacés vers un dossier Archive à l'aide de la tâche de système de fichiers.
Processus étape par étape:
Créez un dossier nommé Archive dans le chemin C:\temp. Créez deux fichiers CSV nommés File_1.csv et File_2.csv et remplissez-les de données. Laissez le dossier Archive vide. Reportez-vous aux captures d'écran # 1 - # 4.
Sur le package SSIS, créez 5 variables comme indiqué dans la capture d'écran # 5. Définissez la variable RootFolder avec la valeur C:\temp\
. Définissez la variable FilePattern avec la valeur *.csv
.
Sélectionnez la variable FilePath et appuyez sur F4 pour ouvrir les propriétés, remplacez la propriété EvaluateAsExpression par True
et définissez la propriété Expression avec la valeur @[User::RootFolder] + @[User::FileName]
comme illustré dans la capture d'écran # 6.
Sélectionnez la variable ArchiveFolder et appuyez sur F4 pour ouvrir les propriétés, remplacez la propriété EvaluateAsExpression par True
et définissez la propriété Expression avec la valeur @[User::RootFolder] + "Archive\\"
comme illustré dans la capture d'écran # 7.
Dans le gestionnaire de connexions du package SSIS, créez une nouvelle connexion de fichier plat nommée CSV . Reportez-vous à la capture d'écran # 8. Configurez la connexion du fichier plat comme indiqué dans les captures d'écran # 9 - # 1. Créez également une connexion OLE DB nommée SQLServer pour vous connecter à la base de données SQL Server. Une fois les connexions créées, elle devrait ressembler à celle illustrée dans la capture d'écran # 14.
Cliquez avec le bouton droit sur la connexion de fichier plat CSV et sélectionnez les propriétés et configurez l'expression ConnectionString avec la valeur @ [User :: FilePath] à l'aide du bouton Points de suspension comme indiqué dans les captures d'écran # 15 - # 16.
Créez une table nommée dbo.Items
dans SQL Server à l'aide des scripts fournis dans la section SQL Scripts. Les données des fichiers CSV seront insérées dans ce tableau.
Dans l'onglet Flux de contrôle, placez un Foreach Loop container
, Data Flow Task
et File System Task
comme illustré dans la capture d'écran # 17.
Configurez le conteneur de boucle Foreach comme indiqué dans les captures d'écran # 18 - # 19.
À l'intérieur de la tâche de flux de données, placez une source de fichier plat, une transformation de colonne dérivée et une destination de base de données OLE DB, comme illustré dans la capture d'écran # 2.
Configurez la source du fichier plat comme indiqué dans les captures d'écran # 21 et # 22. Cela lira les données des fichiers CSV.
Configurez la transformation de colonne dérivée comme indiqué dans la capture d'écran # 2. Ceci est utilisé pour créer la valeur de la colonne FilePath en utilisant la variable du même nom.
Configurez la destination OLE DB comme indiqué dans les captures d'écran # 24 et @ 25. Cela insérera les données dans la table SQL.
Sous l'onglet Flux de contrôle, configurez la tâche du système de fichiers comme indiqué dans la capture d'écran # 26. Veuillez noter que pendant l'opération Déplacer le fichier, le DestinationVariable
ne peut être spécifié que comme répertoire et il ne peut pas être spécifié comme Chemin de fichier complet. Si vous spécifiez le chemin du fichier, vous obtiendrez le message d'erreur [File System Task] Error: An error occurred with the following error message: "Could not find a part of the path.".
La capture d'écran # 28 montre qu'il n'y a pas de données dans la table avant l'exécution du package.
Les captures d'écran # 29 et # montrent les exécutions de packages dans les onglets Flux de contrôle et Flux de données.
Les captures d'écran # 1 et # 2 montrent que les fichiers ont été déplacés vers le dossier Archive.
La capture d'écran # montre les données du tableau après l'exécution du package.
Dans la tâche du système de fichiers, la propriété OverwriteDestination
a été définie sur False (il s'agit de la valeur par défaut). Si vous déplacez des fichiers du même nom vers le dossier Archive, vous obtiendrez l'erreur [File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. ".
montré dans la capture d'écran # 4. Pour éviter cela, définissez OverwriteDestination sur True ou l'autre option consiste à renommer les fichiers et à les copier dans le dossier Archive, puis à les supprimer.
J'espère que cela pourra aider.
Scripts SQL:
CREATE TABLE [dbo].[Items](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ItemNumber] [varchar](30) NOT NULL,
[Price] [numeric](18, 2) NOT NULL,
[FilePath] [varchar](255) NOT NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO
Capture d'écran # 1:
Capture d'écran # 2:
Capture d'écran # 3:
Capture d'écran # 4:
Capture d'écran # 5:
Capture d'écran n ° 6:
Capture d'écran # 7:
Capture d'écran # 8:
Capture d'écran # 9:
Capture d'écran # 10:
Capture d'écran # 11:
Capture d'écran # 12:
Capture d'écran # 13:
Capture d'écran # 14:
Capture d'écran # 15:
Capture d'écran # 16:
Capture d'écran # 17:
Capture d'écran # 18:
Capture d'écran # 19:
Capture d'écran # 20:
Capture d'écran # 21:
Capture d'écran # 22:
Capture d'écran # 23:
Capture d'écran # 24:
Capture d'écran # 25:
Capture d'écran # 26:
Capture d'écran # 27:
Capture d'écran # 28:
Capture d'écran # 29:
Capture d'écran # 30:
Capture d'écran # 31:
Capture d'écran # 32:
Capture d'écran # 33:
Capture d'écran # 34: