[SSIS] Le Data Flow et les Expressions ("Ca marchait bien dans DTS!")

L’autre jour me vient l’idée de modifier dynamiquement la propriété MinSimilarity d’un Fuzzy Lookup depuis un fichier de configuration… Et oh stupeur c’est impossible.
Parce qu’on ne peut pas tout modifier dans SSIS, ça n’est pas DTS…
Nous reparle pas de DTS!

Ah DTS… les scripts ActiveX qui permettent de modifier n’importe quelle propriété du package quel « bonheur ». En effet le modèle objet d’un lot DTS 2000 était directement accessible en écriture depuis le lot lui même. Pratique mais un tel nid à bug qu’un tout autre paradigme a été employé pour SSIS. Les assignations dynamiques de propriétés passent par des Expressions strictement encadrées, mais qui n’enlèvent pas (ou peu) de fonctionnalités de paramétrage dynamique. (Voir ce très vieux postde Jamie Thomson)


Et le Data Flow?

En ce qui concerne le Data Flow, seul le conteneur est de type « exécutable » et possède donc des expressions. Ceci dit certains attributs de ses enfants peuvent être utilisés comme expression: pour cela ils sont dupliqués en tant qu’attributs du composant Data Flow à la création des composants enfants. Par exemple un DataFlow contenant un Lookup possèdera deux propriétés supplémentaires, [NomDuLookup].[SQLCommand] et [NomDuLookup].[SQLCommandParam] qui correspondent aux propriétés avancées du Lookup. Celles ci sont donc assignables par expression..


Mais on constatera rapidement que tout n’est pas exposé… et que certaines propriétés de composants de Data Flow seraient bien pratiques en tant qu’expressions. La liste de ces propriétés settables par expression est trouvable ici sur MSDN.
Pourquoi elles ne sont pas toutes exposées…
Lorsque l’on développe une tâche de Data Flow avec le framework, pour chaque attribut, on peut choisir sa valeur d’ExpressionType. C’est elle qui définit si cette propriété sera exposée ou pas (par duplication dans le composant Data Flow parent) à l’éditeur d’expression, et qui permetrait
– de modifier une propriété par expression
– de l’adresser via une configuration
Cette propriété ExpressionType est un index de l’énumération DTSCustomPropertyExpressionType, positionné par défaut à CPET_NONE (pas settable par expression). Or pour qu’un attribut soit adressable par expression, il faut explicitement que l’ExpressionType vale CPET_NOTIFY.
Les développeurs de SSIS ont globalement setté cette propriété a plein d’endroits utiles… mais ils ont parfois oublié de l’activer.
Et pour les autres propriétés? Dans le cas du MinSimilarity du Fuzzy Lookup?

Il faut donc ruser pour contourner et ça ne sera de toute manière pas très propre. La solution, puisqu’on ne peut pas modifier le package en cours va être de… le modifier depuis un package « lanceur ».
//On instancie une application pour éditer le lot
Microsoft.SqlServer.Dts.Runtime.Application application
= new Microsoft.SqlServer.Dts.Runtime.Application();
//On récupère l’instance du FuzzyLookup via le connection Manager
string packageName
= (string)Dts.Connections[« PackageTest.dtsx »].AcquireConnection(null);
Package package = application.LoadPackage(packageName.ToString(), null);
CManagedComponentWrapper fuzzyLookup
= ((MainPipe)((TaskHost)package.Executables[« DFT »]).InnerObject)
.ComponentMetaDataCollection[« FL »].Instantiate();

//On lui affecte la valeur d’une variable en readonly
int MinSimilarity = (int)Dts.Variables[« MinSimilarity »].Value;
fuzzyLookup.SetComponentProperty(« MinSimilarity », MinSimilarity);

//On sauvegarde (cela aurait pu être en SQL…)
application.SaveToXml(packageName, package, null);
Dts.TaskResult = (int)ScriptResults.Success;
Voilà.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s