19 Stimmen

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

Ich versuche, einen Satz von Dateien aus dem Quellpfad zu einem Archivpfad zu archivieren, sobald ich einige Datenfluss-Task-Elemente abgeschlossen haben. Innerhalb eines Foreach Loop Containers habe ich: Skriptaufgabe -> Datenflussaufgabe -> SQL-Aufgabe ausführen -> Dateisystemaufgabe

Ich habe eine Benutzervariable auf das Element "Name und Erweiterung" unter den Auflistungseinstellungen im Foreach-Schleifencontainer festgelegt. Die Variable heißt "fileName" und wird sowohl im Skript-Task (zum Parsen von Informationen aus der Datei und Ausführen des Execute SQL-Tasks) als auch im Datenfluss-Task im Flat File Connection Manager verwendet, der wiederum vom Flat File Source-Element verwendet wird. Anschließend analysiere ich die Datei und füge die Daten in eine Datenbank ein. Alles funktioniert so, wie es sollte, bis ich zur Dateisystemaufgabe (FST) komme.

Ich möchte, dass die Datei in einen Archivordner verschoben wird, sobald das Einfügen abgeschlossen ist. Über verschiedene Links im Internet ( aquí , aquí et aquí ) Ich habe verschiedene Variablen hinzugefügt, die entweder fest kodiert sind oder durch Massieren anderer Variablen abgeleitet wurden. Auf jeden Fall erhalte ich in der FST Fehlermeldungen wie "ungültige Zeichen im Pfad" oder "unbekannter Pfad". Wenn ich versuche, die oben verlinkten Beispiele an meine Dateisystemstruktur anzupassen, erhalte ich im Schritt "Flat File Source" im Datenfluss-Task einen Fehler, der besagt, dass die angegebene Datei nicht gefunden werden kann. Dies wird verursacht, weil es a) den Pfad zur Datei nicht finden kann, weil kein Dateipfad angegeben ist, sondern nur die Datei filname.ext b) die Variable, die den vollständigen Pfad zur Quelldatei enthält, nicht analysiert werden kann ( @FullSourcePathFileName dessen Wert auf @[User::SourcePath] + @[User::fileName] )

Ich habe andere verschiedene Änderungen getestet, darunter auch genau das, was im ersten Beispiel, das ich gepostet habe, steht (allerdings tut der Datenfluss-Task nichts, so dass ich nur einen Schritt "Flat File Source" ohne Ziel hinzugefügt habe), und ich habe dieselbe Reihe von Fehlern erhalten. Ich bin hier ratlos und würde mich über jeden Beitrag zur Lösung dieses Problems freuen.

EDIT: Anscheinend scheitert es immer wieder an der FullArchivePathFileName - der Ausdruck wird nie ausgewertet, obwohl ich ihn auf "True" gesetzt habe. Ich bin immer noch verwirrt, warum der Ausdruck nicht ausgewertet wird. Also habe ich den Ausdruck wie folgt geändert FullSourcePathFileName und überprüft, ob das Flag EvaluateAsExpression auf True gesetzt ist. Die Variable wird immer noch nicht ausgewertet. FullSourcePathFileName Die Variable wird gut ausgewertet.

74voto

Das folgende Beispiel wurde in SSIS 2005 liest CSV-Dateien aus einem bestimmten Ordner und fügt Daten in eine SQL-Tabelle ein. Nach dem Importieren der Daten in SQL werden die Dateien mit dem File System Task in einen Archivordner verschoben.

Schritt-für-Schritt-Verfahren:

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

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

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

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

  5. Erstellen Sie im Verbindungsmanager des SSIS-Pakets eine neue Flat File-Verbindung mit dem Namen CSV . Siehe Bildschirmfoto # 8 . Konfigurieren Sie die Flatfile-Verbindung wie in den Screenshots gezeigt # 9 - # 13 . Erstellen Sie außerdem eine OLE DB-Verbindung mit dem Namen SQLServer um eine Verbindung mit der SQL Server-Datenbank herzustellen. Nachdem die Verbindungen erstellt wurden, sollte es so aussehen, wie im Screenshot # gezeigt 14 .

  6. Klicken Sie mit der rechten Maustaste auf die Flat-File-Verbindung CSV, wählen Sie Eigenschaften und konfigurieren Sie den Ausdruck ConnectionString mit dem Wert @[User::FilePath], indem Sie die Schaltfläche Ellipsis verwenden, wie in den Screenshots gezeigt. 15 - # 16 .

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

  8. Platzieren Sie auf der Registerkarte Kontrollfluss ein Foreach Loop container , Data Flow Task et File System Task wie in Bildschirmfoto # gezeigt 17 .

  9. Konfigurieren Sie den Foreach-Schleifen-Container wie in den Screenshots gezeigt # 18 - # 19 .

  10. Platzieren Sie innerhalb des Datenfluss-Tasks eine Flat File Source, eine abgeleitete Spaltentransformation und ein OLE DB Destination, wie im Screenshot # gezeigt. 20 .

  11. Konfigurieren Sie die Flat File Source wie in den Screenshots gezeigt # 21 und 22 . Damit werden die Daten aus CSV-Dateien gelesen.

  12. Konfigurieren Sie die abgeleitete Spaltentransformation wie in Screenshot # gezeigt 23 . Damit wird der Wert der Spalte FilePath unter Verwendung der gleichnamigen Variablen erstellt.

  13. Konfigurieren Sie das OLE DB-Ziel wie in den Screenshots gezeigt # 24 und @ 25 . Dadurch werden die Daten in die SQL-Tabelle eingefügt.

  14. Konfigurieren Sie auf der Registerkarte "Kontrollfluss" den Task "Dateisystem" wie in Screenshot # gezeigt. 26 . Bitte beachten Sie, dass während Datei verschieben Betrieb, die DestinationVariable kann nur als Verzeichnis und nicht als vollständiger Dateipfad angegeben werden. 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 Ausführung des Pakets keine Daten in der Tabelle vorhanden sind.

  16. Screenshots. 29 und 30 Paketausführungen in den Registerkarten Kontrollfluss und Datenfluss anzeigen.

  17. Screenshots. 31 und 32 zeigen an, dass die Dateien in den Ordner Archiv verschoben wurden.

  18. Screenshot # 33 zeigt die Daten in der Tabelle nach der Ausführung des Pakets.

  19. Im Task Dateisystem wird die Eigenschaft OverwriteDestination wurde festgelegt auf Falsch (dies ist der Standardwert). Wenn Sie gleichnamige Dateien in den Archivordner verschieben, erhalten Sie die Fehlermeldung [File System Task] Error: An error occurred with the following error message: "Cannot create a file when that file already exists. ". im Screenshot # gezeigt 34 . Um dies zu vermeiden, setzen Sie OverwriteDestination auf True oder Sie benennen die Dateien um, kopieren sie in den Ordner Archive und löschen sie dann.

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

Bildschirmfoto #2:

2

Screenshot #3:

3

Bildschirmfoto #4:

4

Bildschirmfoto #5:

5

Bildschirmfoto #6:

6

Bildschirmfoto #7:

7

Bildschirmfoto #8:

8

Bildschirmfoto #9:

9

Bildschirmfoto #10:

10

Bildschirmfoto #11:

11

Bildschirmfoto #12:

12

Screenshot #13:

13

Bildschirmfoto #14:

14

Screenshot #15:

15

Screenshot #16:

16

Screenshot #17:

17

Bildschirmfoto #18:

18

Screenshot #19:

19

Screenshot #20:

20

Screenshot #21:

21

Bildschirmfoto #22:

22

Screenshot #23:

23

Screenshot #24:

24

Bildschirmfoto #25:

25

Screenshot #26:

26

Screenshot #27:

27

Screenshot #28:

28

Bildschirmfoto #29:

29

Screenshot #30:

30

Screenshot #31:

31

Screenshot #32:

32

Screenshot #33:

33

Bildschirmfoto #34:

34

4 Stimmen

Bei weitem die klarste Erklärung, die ich je gelesen habe. +1 nur für die gesamte Information, die hier enthalten ist. Allerdings hat dies immer noch nicht für mich arbeiten. Schritt 4, wo wir die Variable ArchiveFolder = @[User::RootFolder] + "Archive" erstellen \\ " wird nie ausgewertet. Wenn ich einen Skript-Task direkt vor dem Dateisystem-Task einfüge und einfach die Variable mit MsgBox ausführe, wird sie als "@[User::RootFolder] + "Archive" geschrieben. \\ "". Was mich stutzig macht, ist, dass die Variable FilePath ausgewertet wird. Bei beiden ist die Eigenschaft EvaluateasExpression auf TRUE gesetzt. Ich habe dies mit Scipt Task umgangen, um den Pfad festzulegen.

0 Stimmen

Ding! Da war ein komisches ASCII-Zeichen im Ausdruck. Jetzt wird er geparst! Vielen Dank, dass Sie sich der Sache angenommen haben.

0 Stimmen

Mit solchen Antworten wird es eine bessere Welt sein! +1 Kumpel

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X