18 Stimmen

Wie kann man verhindern, dass die SSIS-FTP-Aufgabe fehlschlägt, wenn keine Dateien zum Herunterladen vorhanden sind?

Ich verwende SQL Server 2005 und erstelle ftp-Aufgaben in SSIS.

Manchmal gibt es Dateien, die per FTP übertragen werden können, manchmal nicht. Wenn es keine Dateien gibt, möchte ich nicht, dass die Aufgabe oder das Paket fehlschlägt. Ich habe den Pfeil, der von der FTP-Aufgabe zur nächsten führt, auf "Abschluss" gesetzt, damit das Paket durchläuft. Ich habe die zulässige Anzahl von Fehlern auf 4 geändert (weil es 4 ftp-Aufgaben gibt und jedes der 4 Verzeichnisse Dateien enthalten kann oder auch nicht).

Wenn ich das Paket jedoch über einen Auftrag im Agenten ausführe, wird der Auftrag als fehlgeschlagen markiert. Da dieser Auftrag alle 15 Minuten ausgeführt wird, möchte ich nicht, dass ein Haufen roter X's in der Auftragshistorie auftauchen, was dazu führt, dass wir ein Problem nicht sehen, wenn es wirklich auftritt.

Wie stelle ich die Eigenschaften in der FTP-Aufgabe so ein, dass das Nichtfinden von Dateien für ftp kein Fehler ist? Die Operation, die ich verwende, ist "Dateien senden".

Hier einige weitere Informationen: Die Dateien befinden sich auf einem Server, zu dem ich nur über FTP Zugang habe. Und ich kenne die Dateinamen nicht im Voraus. Der Benutzer kann sie nennen, wie er will. Ich kann also nicht nach bestimmten Dateien suchen, und ich glaube, ich kann es auch gar nicht. Es sei denn, ich verwende die FTP-Verbindung und Aufgaben, die auf dieser Verbindung basieren. Die Dateien befinden sich auf einem entfernten Server, und ich möchte sie auf meinen Server kopieren, um sie von diesem entfernten Server abzurufen.

Ich kann einen ftp-Befehl in einer Skriptaufgabe ausführen. Vielleicht ist es das, was ich anstelle einer ftp-Aufgabe verwenden muss. (Ich bin dazu übergegangen, die ftp-Befehlszeile mit einer Parameterdatei zu verwenden, die von einer Skriptaufgabe aufgerufen wird. Es gibt keine Fehlermeldungen, wenn es keine Dateien zu holen gibt. Ich denke, dass diese Lösung für mich funktionieren wird. Ich erstelle die Parameterdatei dynamisch, was bedeutet, dass ich die Verbindungsinformationen nicht in der reinen Textdatei haben muss, sondern sie in meiner Konfigurationsdatei speichern kann, die sich an einem sichereren Ort befindet).

0 Stimmen

Wenn Sie Ihre Frage lesen, scheint es, dass Sie null bis viele Dateien lokal haben und diese per FTP an einen entfernten Standort übertragen möchten. Wenn ich mir Ihre Antwort ansehe, scheint es so, als ob Sie null bis viele Dateien am entfernten Standort haben und diese auf den lokalen Standort übertragen wollen. Könnten Sie das bitte klären? :)

0 Stimmen

Es waren null zu viele Dateien am entfernten Standort, und ich wollte sie auf den lokalen Standort bringen.

0voto

Meff Punkte 5769

Fügen Sie sie in einen ForEach-Container ein, der die hochzuladenden Dateien durchläuft. Keine Dateien, kein FTP, kein Fehler.

0voto

baldy Punkte 5464

Sie können bei einem Fehlschlag zu einer anderen Aufgabe umleiten, die nichts tut, d. h. zu einem Skript, das nur true zurückgibt.

Fügen Sie dazu die neue Skriptaufgabe hinzu, markieren Sie Ihre FTP-Aufgabe, ein zweites grünes Verbindungsstück erscheint, ziehen Sie dieses auf die Skriptaufgabe und doppelklicken Sie darauf. Wählen Sie in der Dropdown-Liste "Wert" die Option "Fehler". Natürlich müssen Sie dann echte Fehler in dieser Skriptaufgabe behandeln, damit sie im Auftragsverlauf richtig angezeigt werden.

0voto

Meff Punkte 5769

Aha, OK - Danke für die Klarstellung. Da die FTP-Aufgabe nicht eine Ordnerliste zurückgeben kann, wird es nicht möglich sein, die ForEach zu verwenden, wie ich zunächst sagte - Das funktioniert nur, wenn Sie X Menge von Dateien zu einer Remote-Quelle hochladen.

Um eine bestimmte Anzahl von Dateien herunterzuladen, gibt es zwei Möglichkeiten: Entweder Sie tun es vollständig in .Net in einem Skript-Task oder Sie füllen eine ArrayList mit den Dateinamen aus einem .Net-Skript-Task, dann ForEach über die ArrayList, übergeben den Dateinamen an eine Variable und laden diesen Variablennamen in einem Standard-FTP-Task herunter.

Entsprechendes Code-Beispiel: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=2472491&SiteID=1

Im obigen Beispiel würden Sie also die FileNames() abrufen und die ArrayList daraus füllen, dann die ArrayList einer Variablen des Typs Object in Dts.Variables zuweisen und dann ForEach über diese Variable Object (ArrayList) mit folgendem Code ausführen h

0voto

Kilani Punkte 1

Sie können den kostenlosen SSIS FTP Task++ von eaSkills verwenden. Er gibt keine Fehlermeldung aus, wenn die Datei oder die Dateien nicht existieren, er unterstützt Wildcards und gibt Ihnen die Möglichkeit, herunterzuladen und zu löschen, wenn Sie dies tun müssen.

Hier ist der Link zur Feature-Seite: http://www.easkills.com/ssis/ftptask

0voto

Chad Punkte 541

Dies ist eine andere Lösung, die für mich funktioniert, mit eingebauten Sachen und so ohne manuelles Neuschreiben der FTP-Logik:

1) Erstellen Sie in Ihrem Paket eine Variable namens FTP_Error

2) Klicken Sie auf Ihren FTP-Task und dann auf die Registerkarte "Ereignisbehandler".

3) Klicken Sie innerhalb der Seite, um einen Event-Handler für "FTP Task/OnError" zu erstellen - dieser wird immer dann ausgelöst, wenn es Probleme mit dem FTP gibt

4) Ziehen Sie aus der Toolbox ein Skript-Task-Element hinein, und doppelklicken Sie darauf, um es zu öffnen.

5) Im ersten Pop-up, ReadOnlyVariables - fügen Sie System::ErrorCode, System::ErrorDescription

6) Fügen Sie im ersten Popup-Fenster, ReadWriteVariables, die Variable User::FTP_Error hinzu.

7) Skript bearbeiten

8) Legen Sie im Skript die Variable FTP_Error so fest, dass sie die ReadOnlyVariablen enthält, die wir oben hatten:

Dts.Variables["FTP_Error"].Value = "ErrorCode:" + Dts.Variables["ErrorCode"].Value.ToString() + ", ErrorDescription=" + Dts.Variables["ErrorDescription"].Value.ToString();

9) Skript speichern und schließen

10) Klicken Sie auf "OK", um das Skript zu starten.

11) Gehen Sie zurück zur Registerkarte "Kontrollfluss".

12) Wechseln Sie in der FTP-Aufgabe OnError zu einer neuen Skript-Aufgabe, und bearbeiten Sie diese

13) NurLesenVariablen: User::FTP_Error von vorher

14) Wenn keine Dateien auf dem FTP-Server gefunden werden, lautet der Fehlercode -1073573501 (Die Referenzliste der Fehlercodes finden Sie hier: http://msdn.microsoft.com/en-us/library/ms345164.aspx )

15) Fügen Sie in Ihr Skript die Logik ein, um das zu tun, was Sie wollen - wenn Sie einen "no files found"-Code finden, dann sagen Sie vielleicht, dass die Aufgabe erfolgreich war. Wenn nicht, dann ist die Aufgabe fehlgeschlagen. Und Ihr normaler Ablauf kann dies so handhaben, wie Sie es wünschen:

if (Dts.Variables["FTP_Error"].Value.ToString().Contains("-1073573501"))
{
  // file not found - not a problem
  Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
  // some other error - raise alarm!
  Dts.TaskResult = (int)ScriptResults.Failure;
}

Und von dort aus wird Ihr Succeeded/Failed-Flow das tun, was Sie mit ihm tun wollen.

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