Comment éviter SSIS FTP tâche de l'échec quand il n'y a pas de fichiers à télécharger?
Je suis à l'aide de SQL Server 2005, et la création de ftp tâches au sein de SSIS.
Parfois il y aura des fichiers ftp, parfois pas. Si il n'y a pas de fichiers, je ne veux pas la tâche ni le colis à l'échec. J'ai changé la flèche allant de la tâche ftp pour le côté "achèvement", de sorte que le paquet traverse. J'ai changé le nombre autorisé d'erreurs à 4 (car il y a 4 ftp tâches, et l'un des 4 répertoires peuvent ou peuvent ne pas avoir de fichiers).
Mais, lorsque je lance le package à partir d'un travail de l'agent, il marque le travail comme un échec. Car ce sera circulant toutes les 15 minutes, je ne veux pas d'un tas de x rouge dans mon travail d'histoire, qui va nous amener à ne pas voir un problème quand il n'a vraiment se produire.
Comment puis-je configurer les propriétés de la tâche ftp afin de ne pas trouver les fichiers en ftp n'est pas un échec? L'opération que j'utilise est "Envoyer des fichiers".
Voici quelques informations supplémentaires: les fichiers sont sur un serveur que je n'ai pas accès par le biais de l'exception ftp. Et, je ne sais pas les noms de fichiers à l'avance. L'utilisateur peut appeler de ce qu'ils veulent. Donc je ne peux pas vérifier pour des fichiers spécifiques, ni, je pense, puis-je vérifier à tous. Sauf par le biais de l'aide de la connexion ftp et tâches sur la base de cette connexion. Les fichiers sont sur un serveur distant, et je veux les copier sur mon serveur, pour les obtenir à partir de ce serveur distant.
Je peux shell de commande de niveau ftp dans une tâche de script. Peut-être que c'est ce que je dois utiliser à la place d'une tâche ftp. (J'ai changé d'utiliser la ligne de commande ftp, avec un fichier de paramètres, appelés à partir d'une tâche de script. Il ne donne aucune erreur quand il n'y a pas des fichiers. Je pense que cette solution est d'aller travailler pour moi. Je crée le fichier de paramètres de façon dynamique, ce qui signifie que je n'ai pas besoin d'avoir les informations de connexion dans le fichier de texte brut, mais peuvent être stockés dans mon fichier de configuration, qui est dans un endroit plus sûr.)
- La lecture de votre question, il semble que vous avez zéro à plusieurs fichiers en local, et vous voulez via FTP vers un site distant. En regardant votre réponse pour moi, il semble que vous avez le zéro pour peut fichiers sur le site distant, et vous voulez amener jusqu'à l'échelle locale. Pourriez-vous préciser s'il vous plaît? 🙂
- C'était zéro à de nombreux fichiers sur le site distant, et j'ai voulu apporter leur local.
Vous devez vous connecter pour publier un commentaire.
Je comprends que vous avez trouvé la réponse à votre question. C'est pour les autres utilisateurs qui pourraient trébucher sur cette question. Ici est une manière possible de parvenir à ce but.
Script Task
peut être utilisé pour trouver la liste des fichiers présents dans un dossier FTP chemin d'accès pour un modèle donné (disons*.txt
). L'exemple ci-dessous montre comment cela peut être fait.Étape-par-étape du processus:
Sur le package SSIS, créer un
FTP Connection
nommé FTP et aussi de créer des 5 variables, comme indiqué dans la capture d'écran #1. VariableRemotePath
contient le dossier FTP chemin;LocalPath
contient le dossier où les fichiers vont être téléchargé à l';FilePattern
contient le modèle de fichier pour trouver la liste des fichiers à télécharger à partir du serveur FTP;FileName
seront remplis par leForeach loop container
, mais pour éviter la tâche FTP moment de la conception d'erreur, il peut être rempli avec / ou laDelayValidation
bien sur le FTP Tâche peut être définie à Vrai.Sur le package SSIS, placez un
Script Task
,Foreach Loop container
etFTP Task
dans leForeach Loop container
comme indiqué dans les captures d'écran #2.Remplacer le
Main()
méthode au sein de laScript Task
avec le code dans la Tâche de Script Code section. Script Tâche de remplir la variable ListOfFiles avec la collection de fichiers correspondant à un modèle donné. Cet exemple va d'abord utiliser le modèle *.txt, ce qui ne donne aucun résultat, puis plus tard, le modèle *.xls qui va correspondre à quelques fichiers sur le serveur FTP.Configurer le
Foreach Loop container
comme indiqué dans les captures d'écran #3 et #4. Cette tâche passe en boucle sur la variable **ListOfFiles*. Si il n'y a pas de fichiers, le FTP tâche à l'intérieur du conteneur de boucle ne s'exécute pas. Si il y a des fichiers, le FTP tâche à l'intérieur de la boucle de conteneur pour exécuter la tâche pour le nombre de fichiers présents sur le serveur FTP.Configurer le
FTP Task
comme indiqué dans les captures d'écran #5 et #6.Capture d'écran #7 montre des exemples de l'exécution du package lorsque pas fichiers correspondants sont trouvés pour le modèle de la
*.txt
.Capture d'écran #8 montre le contenu du dossier
C:\temp\
avant exécution du package.Capture d'écran #9 montre des exemples de l'exécution du package lors de l'appariement des fichiers sont trouvés pour le modèle de la
*.xls
.Capture d'écran #10 montre le contenu du FTP chemin d'accès à distance
/Practice/Directory_New
.Capture d'écran #11 montre le contenu du dossier
C:\temp\
après exécution du package.Capture d'écran #12 montre l'échec de package lorsqu'il est fourni avec incorrecte chemin d'accès à Distance.
Capture d'écran #13 affiche le message d'erreur liés à l'échec de package.
Espère que ça aide.
Script Code De La Tâche:
C# code qui peut être utilisé dans
SSIS 2008 and above
.Inclure la
using
déclaration en utilisant le Système.Texte.RegularExpressions;VB code qui peut être utilisé dans
SSIS 2005 and above
.Inclure la
Imports
déclaration Importations Système.Texte.RegularExpressionsCapture d'écran #1:
Capture d'écran #2:
Capture d'écran #3:
Capture d'écran #4:
Capture d'écran #5:
Capture d'écran #6:
Capture d'écran #7:
Capture d'écran n ° 8:
Capture d'écran n ° 9:
Capture d'écran n ° 10:
Capture d'écran #11:
Capture d'écran n ° 12:
Capture d'écran n ° 13:
Cochez cette lien qui décrit de gracieusement la manipulation de la tâche d'erreur dans le Package SSIS.
J'ai eu presque le même problème, mais, avec de la récupération de fichiers. Je voulais que le paquet ne PAS manquer lorsque aucun fichier n'a été trouvé sur le serveur FTP. Le lien ci-dessus cesse de l'erreur de propagation et de provoquer le paquet à l'échec, quelque chose que vous auriez pensé FailPackageOnError=false ont fait? :-S
Espère que cela résout-il pour vous aussi!
J'ai juste eu ce problème, après la lecture de certaines réponses ici, rien n'est vraiment réglé mon problème et les solutions ici sembler fou en termes de complexité.
Mon FTP tâche n'était pas parce que je n'ai pas de permettre l'écrasement de fichiers, permet de dire que le travail a démarré deux fois dans une ligne, la première étape sera la bonne, parce que certains fichiers sont transférés sur, mais échouera si un fichier local existe déjà.
Ma solution était simple:
(Je ne peux pas accepter ma propre réponse, mais c'est la solution qui a fonctionné pour moi.)
Il peut ne pas être la meilleure solution, mais cela fonctionne.
- Je utiliser une tâche de script, et avoir un tas de variables pour les informations de connexion ftp, et les répertoires source et destination. (Parce que, nous allons modifier le serveur, c'est en marche, et il sera plus facile de changer dans un package de configuration.)
J'ai créer un fichier texte à la volée, et d'écrire les commandes ftp pour elle:
Puis, après avoir donné assez de temps pour vraiment fermer, je commence un processus pour la commande ftp:
Puis, après lui donnant un peu plus de temps pour le ftp processus à exécuter, j'ai supprimer le temporaire de fichiers ftp (qui a des informations de connexion!).
Si les fichiers n'existent pas dans le répertoire source (la variable a la \\drive\dir\*.* cartographie), alors il n'y a pas d'erreur. Si une autre erreur se produit, la tâche échoue encore, comme il se doit.
Je suis nouveau sur SSIS, et cela peut être une bidouille. Mais il fonctionne pour l'instant. Je suppose que j'ai demandé pour le mieux, et je vais certainement pas prétendre que c'est elle.
Comme je l'ai souligné, je n'ai aucun moyen de savoir ce que les fichiers sont nommés, ou même s'il y a des fichiers à tous. Si elles sont là, je veux obtenir.
Je n'ai pas emballé réponse pour vous, mais puisque personne n'a posté sur ce sujet...
Vous devriez être en mesure de définir une variable dans une tâche de script ActiveX et ensuite l'utiliser pour décider si ou de ne pas le FTP tâche doit s'exécuter. Il est un exemple ici qui fonctionne avec des chemins locaux. J'espère que vous pourrez adapter le concept (ou, si possible, la carte de la FTP lecteur et de le faire de cette façon).
1) Définir la Tâche FTP propriété ForceExecutionResult = Succès
2) Ajouter ce code à la Tâche FTP OnError gestionnaire d'événement.
Le mettre dans un ForEach conteneur, qui parcourt les fichiers à télécharger. Pas de dossiers, pas de FTP, pas d'échec.
Vous pouvez rediriger en cas d'échec, à une autre tâche qui ne fait rien, c'est à dire un script qui retourne vrai.
Pour ce faire, ajoutez la nouvelle tâche de script, sélectionnez votre tâche FTP, un deuxième connecteur vert apparaît, faites glisser ce sur la tâche de script, puis double-cliquez dessus. Sélectionnez l'Échec sur la Valeur de la liste déroulante. Évidemment, vous aurez alors besoin de gérer de véritables échecs dans cette tâche de script pour toujours le droit d'affichage dans l'historique de Travail.
Ah, OK Merci pour les précisions. Comme la tâche FTP ne peut pas renvoyer un dossier d'inscription, il ne sera pas possible d'utiliser la boucle ForEach, comme je l'ai d'abord dit - qui ne fonctionne Que si vous avez télécharger X quantité de fichiers à une source distante.
Pour télécharger X quantité de fichiers, vous pouvez aller de deux façons, soit vous pouvez le faire entièrement .Net dans une tâche de script, ou vous pouvez remplir une liste de tableaux avec les noms de fichiers à partir de dans un .Net tâche de script, puis ForEach sur la liste de tableaux, en passant le nom du fichier à une variable et le téléchargement de ce nom de la variable dans une norme tâche FTP.
Exemple de Code pour l'adapter à: http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=2472491&SiteID=1
Donc, ci-dessus, vous obtiendrez les noms de fichiers() et remplir la liste de tableaux de qui, puis affectez-lui la liste de tableaux à un Objet de type variable en Dts.Des Variables, alors ForEach sur cet Objet (ArrayList) de la variable à l'aide de code quelque chose comme: http://www.sqlservercentral.com/articles/SSIS/64014/
Vous pouvez utiliser gratuitement SSIS Tâche FTP++ à partir de eaSkills. Il ne jette pas une erreur si le fichier ou les fichiers n'existent pas, le support des cartes sauvages et vous donne la possibilité de les télécharger et de les supprimer si vous avez besoin de le faire.
Voici le lien vers la page de fonctionnalité:
http://www.easkills.com/ssis/ftptask
C'est une autre solution qui fonctionne pour moi, à l'aide intégrée dans le stuff et donc sans manuellement ré-écriture de la FTP logique:
1) Créer une variable dans votre paquet appelé FTP_Error
2) Cliquez sur votre FTP Tâche, puis cliquez sur "Event Handlers" onglet
3) Cliquez à l'intérieur de la page pour créer un gestionnaire d'événements pour "Tâche FTP/OnError" - ce sera le feu à chaque fois qu'il y a des problèmes avec le FTP
4) De la boîte à outils, faites glisser le Script d'un élément de Tâche, et double-cliquez pour l'ouvrir jusqu'
5) Dans le premier pop-up, ReadOnlyVariables - ajouter un Système::ErrorCode, System::ErrorDescription
6) Dans le premier pop-up, ReadWriteVariables - ajouter votre Utilisateur::FTP_Error variable
7) Modifier Le Script
8) Dans l'ensemble de script de votre FTP_Error variable pour contenir la ReadOnlyVariables nous avions ci-dessus:
9) Enregistrez et fermez script
10) appuyez sur "OK" à la tâche de script
11) retournez à la section "Contrôle de Flux" onglet
12) De la tâche FTP, OnError aller à une nouvelle tâche de Script, et de le modifier
13) ReadOnlyVariables: User::FTP_Error avant
14) Maintenant, quand il y a aucun fichier sur le FTP, le code d'erreur est -1073573501
(vous pouvez trouver la référence des codes d'erreur de la liste ici: http://msdn.microsoft.com/en-us/library/ms345164.aspx)
15) Dans votre script, mettre dans la logique de faire ce que vous voulez - si vous trouvez un "no files found" code, alors peut-être vous dire que la tâche de succès. Si non, alors la tâche a échoué. Et votre flux normal pouvez gérer ce que vous souhaitez:
Et à partir de là, votre réussite/l'Échec de flux à faire ce que vous voulez faire avec elle.
Une alternative est d'utiliser cette De Fichiers FTP Énumérateur