Wie verschiebe ich Dateien in einen Archivordner, nachdem die Dateien verarbeitet wurden?

Ich versuche, eine Reihe von Dateien aus dem Quellpfad in einen Archivpfad zu archivieren, nachdem ich einige Datenfluss-Aufgabenelemente abgeschlossen habe. Innerhalb eines Foreach-Loop-Containers habe ich: Skript-Aufgabe -> Datenfluss-Aufgabe -> SQL-Aufgabe ausführen -> Dateisystem-Aufgabe

Ich habe eine Benutzervariable auf den Eintrag “Name und Erweiterung” unter den Sammlungseinstellungen im Foreach-Loop-Container festgelegt. Die Variable heißt “fileName” und wird sowohl in der Script-Task (zum Auslesen von Informationen aus einer Datei und zum Ausführen der SQL-Task ausführen) als auch in der Datenfluss-Task im Flat File Connection Manager verwendet, der wiederum von das Flat File Source Element. Ich parse dann die Datei und füge die Daten in eine database ein. Alles funktioniert wie es sollte, bis ich zur Dateisystemaufgabe (FST) komme.

Ich möchte, dass die Datei in einen Archivordner verschoben wird, sobald die Einfügung abgeschlossen ist. Unter Verwendung mehrerer Links online ( hier , hier und hier ) habe ich verschiedene Variablen hinzugefügt, die entweder fest codiert sind oder von massierenden anderen Variablen abgeleitet sind. In jedem Fall passiert, dass auf der FST Fehler wie “ungültige Zeichen im Pfad” oder “unbekannter Pfad” auftreten. Wenn ich versuche, die oben verlinkten Beispiele zu massieren, um sie an meine Dateisystemstruktur anzupassen, erhalte ich jetzt einen Fehler im Schritt “Flache Dateiquelle” in der Datenflussaufgabe, der besagt, dass die angegebene Datei nicht gefunden werden kann. Dies liegt daran, dass es a) den Pfad zur Datei nicht finden kann, da kein Dateipfad angegeben ist, nur filname.ext b) die Variable, die den vollständigen Pfad zur Quelldatei enthält, nicht analysieren kann ( @FullSourcePathFileName den der Wert gesetzt ist) @[User::SourcePath] + @[User::fileName] )

Ich habe andere verschiedene Modifikationen getestet, einschließlich das, was genau im ersten Beispiel ist, das ich gepostet habe (aber, dass man eigentlich nichts mit der Datenflusstask macht, also habe ich gerade einen Schritt ohne Quelle hinzugefügt) und die gleichen Fehler erhalten . Ich bin hier ratlos und hätte gerne Vorschläge zur Lösung dieses Problems.

BEARBEITEN: Scheint, dass es auf dem FullArchivePathFileName – es wertet nie den Ausdruck aus, obwohl ich es auf ‘True’ gesetzt habe. Immer noch verwirrt, warum es es nicht bewertet. Also habe ich seinen Ausdruck wie FullSourcePathFileName und überprüft, dass das EvaluateAsExpression-Flag auf True gesetzt ist. Diese Variable wird immer noch nicht ausgewertet. Die FullSourcePathFileName Variable wird gerade gut ausgewertet.

    Das folgende in SSIS 2005 erstellte Beispiel liest CSV-Dateien aus einem bestimmten Ordner und fügt Daten in eine SQL-Tabelle ein. Nach dem Importieren von Daten in SQL werden die Dateien dann mithilfe der Dateisystemaufgabe in einen Archivordner verschoben.

    Schritt-für-Schritt-process:

    1. Erstellen Sie einen Ordner namens Archiv im Pfad C: \ temp. Erstellen Sie zwei CSV-Dateien namens File_1.csv und File_2.csv und füllen Sie sie mit Daten. Lassen Sie den Archivordner leer. Siehe Screenshots # 1 – # 4 .

    2. Erstellen Sie im SSIS-Paket 5 Variablen, wie in Screenshot 5 gezeigt . Legen Sie die Variable RootFolder mit dem Wert C:\temp\ . Setzen Sie die Variable FilePattern mit dem Wert *.csv .

    3. Wählen Sie die Variable FilePath und drücken Sie F4, um Eigenschaften zu öffnen, ändern Sie die Eigenschaft EvaluateAsExpression in True und setzen Sie die Expression-Eigenschaft mit dem Wert @[User::RootFolder] + @[User::FileName] wie in Screenshot 6 gezeigt .

    4. Wählen Sie die Variable ArchiveFolder und drücken Sie F4, um Eigenschaften zu öffnen, ändern Sie die Eigenschaft EvaluateAsExpression in True und setzen Sie die Expression-Eigenschaft mit dem Wert @[User::RootFolder] + "Archive\\" wie in Screenshot # 7 gezeigt .

    5. Erstellen Sie im Verbindungs-Manager des SSIS-Pakets eine neue Flatfile-Verbindung namens CSV . Siehe Screenshot # 8 . Konfigurieren Sie die Flat-File-Verbindung wie in den Screenshots 913 gezeigt . Erstellen Sie außerdem eine OLE DB-Verbindung mit Name SQLServer , um eine Verbindung mit der SQL Server-database herzustellen . Nachdem die Verbindungen erstellt wurden, sollte es wie in Screenshot 14 aussehen.

    6. Klicken Sie mit der rechten Maustaste auf die CSV-Datei für einfache Dateiverbindungen und wählen Sie Eigenschaften und konfigurieren Sie den ConnectionString-Ausdruck mit dem Wert @ [User :: FilePath] mithilfe der Schaltfläche “Ellipse” wie in den Screenshots 15 bis 16 gezeigt .

    7. Erstellen Sie eine Tabelle mit dem Namen dbo.Items in SQL Server mithilfe der Skripts, die im Abschnitt SQL-Skripts bereitgestellt werden. Die Daten der CSV-Dateien werden in diese Tabelle eingefügt.

    8. Foreach Loop container Sie auf der Registerkarte “Steuerungsfluss” einen Foreach Loop container , eine Datenflussaufgabe und eine File System Task wie in Screenshot 17 gezeigt ab .

    9. Konfigurieren Sie den Foreach-Loop-Container wie in den Screenshots 18 bis 19 gezeigt .

    10. Platzieren Sie in der Datenflusstask eine Flat File-Quelle, eine Transformation für eine abgeleitete Spalte und ein OLE DB-Ziel, wie in Screenshot 20 gezeigt .

    11. Konfigurieren Sie die Flat File Source wie in den Screenshots 21 und 22 gezeigt . Dies liest die Daten aus CSV-Dateien.

    12. Konfigurieren Sie die Transformation für abgeleitete Spalten wie in Screenshot 23 gezeigt . Dies wird verwendet, um den FilePath-Spaltenwert unter Verwendung der gleichnamigen Variablen zu erstellen.

    13. Konfigurieren Sie das OLE DB-Ziel wie in den Screenshots 24 und 25 gezeigt . Dies fügt die Daten in die SQL-Tabelle ein.

    14. Konfigurieren Sie auf der Registerkarte Kontrollfluss den Dateisystem-Task wie in Screenshot 26 gezeigt . Bitte beachten Sie, dass die DestinationVariable beim Verschieben von Dateien nur als Verzeichnis angegeben werden kann und nicht als vollständiger Dateipfad angegeben werden kann. Wenn Sie den Dateipfad angeben, erhalten Sie die Fehlermeldung [File System Task] Error: An error occurred with the following error message: "Could not find a part of the path.".

    15. Screenshot 28 zeigt, dass vor der Paketausführung keine Daten in der Tabelle vorhanden sind.

    16. Die Screenshots # 29 und # 30 zeigen Paketausführungen in den Registerkarten “Kontrollfluss” und “Datenfluss”.

    17. Screenshots # 31 und # 32 zeigen, dass die Dateien in den Archivordner verschoben wurden.

    18. Screenshot 33 zeigt die Daten in der Tabelle nach der Paketausführung.

    19. In der Dateisystemaufgabe wurde die Eigenschaft OverwriteDestination auf False gesetzt (dies ist der Standardwert). Wenn Sie Dateien mit demselben Namen in den Archivordner verschieben, erhalten Sie den Fehler [File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. ". im Screenshot # 34 gezeigt . Um dies zu vermeiden, setzen Sie OverwriteDestination auf True oder die andere Option besteht darin, die Dateien umzubenennen und sie in den Archivordner zu kopieren und dann zu löschen.

    Ich hoffe, das hilft.

    SQL-Skripte:

     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 

    Screenshot 1:

    1

    Screenshot 2:

    2

    Screenshot 3:

    3

    Screenshot 4:

    4

    Screenshot 5:

    5

    Screenshot 6:

    6

    Screenshot 7:

    7

    Screenshot 8:

    8

    Screenshot 9:

    9

    Screenshot 10:

    10

    Screenshot 11:

    11

    Screenshot 12:

    12

    Screenshot 13:

    13

    Screenshot 14:

    14

    Screenshot 15:

    15

    Screenshot 16:

    16

    Screenshot 17:

    17

    Screenshot 18:

    18

    Screenshot 19:

    19

    Screenshot 20:

    20

    Screenshot 21:

    21

    Screenshot 22:

    22

    Screenshot 23:

    23

    Screenshot 24:

    24

    Screenshot 25:

    25

    Screenshot 26:

    26

    Screenshot 27:

    27

    Screenshot 28:

    28

    Screenshot 29:

    29

    Screenshot 30:

    30

    Screenshot 31:

    31

    Screenshot 32:

    32

    Screenshot 33:

    33

    Screenshot 34:

    34