J’avais déjà écrit un article sur le problème que pouvait représenter le chargement d’un fichier excel avec un foreach loop container depuis un espace réseau ici => http://sauget-ch.fr/2014/09/ssis-attention-au-chargement-de-fichiers-excel/
Mon collègue Patrice m’a remonté un autre problème lorsque votre expression conditionnant le chemin de destination de votre fichier comporte une erreur.
Reprenons les étapes une par une.
1 – Créez une variable « Directory » afin d’indiquer le dossier qui contiendra vos fichiers :
2 – Configurez le composant « Foreach Loop Component » afin d’itérer sur les fichiers présents dans notre variable « Directory »
Je vous passe la configuration en question que l’on trouve en quantité abondante sur internet et que vous pouvez trouver ici => http://www.sqlis.com/sqlis/post/Looping-over-files-with-the-Foreach-Loop.aspx
Nous allons donc itérer sur nos fichiers présents dans « Directory » et renseigner à chaque itération la variable « FileName » qui contiendra le nom et l’extension de notre fichier.
3 – Nous avons récupéré uniquement le nom + extension de notre fichier afin de pouvoir créer une destination du type :
c:\test\destination\aaaamm_monfichier.xlsx
Nous créerons donc une troisième variable « DestinationPath » qui contiendra l’expression suivante :
(DT_WSTR,6) (YEAR(GETDATE())*100+MONTH(GETDATE()))+"_"+@[User::FileName]
Jusqu’ici rien d’exotique, vous avez déjà fait ça 1000 fois… tout va bien.
Dans mon cas si je fais une erreur lors de ma conversion et je change mon expression par
(DT_WSTR,4) (YEAR(GETDATE())*100+MONTH(GETDATE()))+"_"+@[User::FileName]
Visual studio va me sanctionner lors de la validation de mon expression :
Mais que se passe t’il si je ne passe pas par cette évaluation, par exemple parce-que (YEAR(GETDATE())*100+MONTH(GETDATE())) est stocké dans une variable intermédiaire et qu’il n’est donc pas possible pour SSIS de savoir que le int en question va dépasser les 4 caractères ? Ou bien parce que votre valeur est dynamique et qu’elle peut donc parfois retourner 4 ou 6 caractères ?
SSIS ne retourne pas d’erreur à l’exécution mais évaluera votre expression à NULL.
Voici l’exemple qui fonctionne :
Et l’exemple qui ne fonctionne pas, mais ne retourne pas d’erreur :
Soyez donc vigilant lorsque vous effectuez des conversions dans une expression SSIS, si comme dans mon exemple votre expression est fixe, l’absence de valeur va vous mettre la puce à l’oreille, mais dans le cas où votre expression est évaluée sur une variable dont le contenu change dynamiquement… cela risque d’être plus subtile à détecter et à corriger.
Une petite vidéo pour voir le problème :