Business Geek

Aller au contenu | Aller au menu | Aller à la recherche

Tag - Integration Services

Fil des billets - Fil des commentaires

dimanche 17 février 2008

Insertion en masse et Triggers

On m'a récemment posé cette question :

j'ai 300.000 enregistrements à insérer et pour chaque insertion, les triggers doivent être exécutés

Quand on parle d'une telle volumétrie d'insertion, on pense tout de suite à de l'insertion en mode BULK. Pour ce faire, nous avons à disposition :

  • un utilitaire en ligne de commande : bcp
  • l'instruction T-SQL : BULK INSERT

Le problème c'est que l'insertion BULK désactive les triggers par défaut. Mais les deux méthodes proposent une option pour ré-activer les triggers.

bcp -h "FIRE_TRIGGERS"

BULK INSERT .... WITH (FIRE_TRIGGERS)

Integration Services utilise intensivement l'insertion BULK via son composant OLE DB Destination avec l'option FastLoad. Les triggers étant désactivés par défaut, il faut les réactiver dans les options avancées du composant. Dans les propriétés, il y en a une appelée FastLoadOptions qui correspond au WITH de l'instruction BULK INSERT. Il suffit juste de rajouter FIRE_TRIGGERS dans la liste (séparé par des virgules).

lundi 28 janvier 2008

Requêter un cube Analysis Services depuis SSIS

On pourrait penser que requêter un cube OLAP avec Integration Services est trivial et pourtant, avec un collègue, nous nous sommes heurtés à quelques difficultés.

Première tentative :

Naïvement, nous créons une connexion de type OLE DB Provider for Analysis Services 9.0. On la branche sur un OLE DB Source et en guise de SQL Command, je tape ma requête MDX (les ventes par catégories depuis le DataWarehouse de AdventureWorks) :

SELECT NON EMPTY { [Measures].[Sales Amount] } ON COLUMNS,NON EMPTY { ([Dim Product].[Dim Product Category].[Dim Product Category].ALLMEMBERS ) } ON ROWS FROM [AdventureWorks]

A la confirmation, l'avertissement suivant apparaît :

[OLE DB Source [1]] Warning: The output "OLE DB Source Output" (11) references an external data type that cannot be mapped to a Data Flow task data type. The Data Flow task data type DT_WSTR will be used instead.

Soit, qu'il en soit ainsi, un WSTR me plait bien, de plus que la preview me montre bien le résultat attendu. Je termine mon package en dirigeant le flux vers un bête FlatFile.

A l'exécution, le warning réapparaît mais plus grave, le package plante violemment(lançant SQLDumper.Exe au passage).

La solution :

Il faut en fait passer par .NET et utiliser les providers "managed". On crée donc une ADO.NET Connection via un clic droit dans la zone des Connection Managers. Dans la liste des .NET Providers for OleDb, on choisit Analysis Services 9.0 (oui, le même mais en managé) et on le configure pour pointer sur notre cube.

Dans le Data Flow Task, on glisse un DataReader Source auquel on branche la connexion créée ci-dessus. Pas d'avertissement, on continue en branchant la sortie vers le fichier, on teste et ça marche immédiatement. Vous aurez peut-être juste besoin d'une conversion de type si vous n'êtes pas en UNICODE mais rien de difficile là-dedans (Data Conversion Transformation).

Merci à Julien sans qui je n'aurai jamais publié cet article (avant un moment).

 

PS : désolé, toutes les instructions sont en anglais car j'utilise une version US des produits, ce que je vous conseille même si vous êtes fan de la loi Toubon.