2009-09-25 8 views
4

J'utilise un package SSIS pour charger un million de lignes à partir d'un fichier plat, qui utilise une tâche de script pour les transformations complexes et une destination de table SQL Server. J'essaie de trouver la meilleure façon (bien, de toute façon à ce stade) d'écrire dans un tableau différent le nombre de lignes (probablement en multiples de 1000 pour être plus efficace) PENDANT le traitement du flux de données. C'est ainsi que je peux déterminer le pourcentage de progression au cours d'une tâche qui peut prendre quelques minutes, simplement en interrogeant la table périodiquement.Mesure de la progression du flux de données SSIS

Je n'arrive pas à ajouter de tâche SQL dans le flux, donc je suppose que le seul moyen est de se connecter à la base de données SQL dans le script .NET. Cela semble douloureux et je ne suis même pas sûr que ce soit possible. Y a-t-il un autre moyen plus élégant? J'ai vu une référence au compteur de performance "Rows Read" mais je ne sais pas où j'accède à cela dans SSIS et je ne sais toujours pas comment l'écrire dans une table SQL pendant le traitement du flux de données.

Toute suggestion appréciée.

Glenn

Répondre

1

OK, eu un certain succès à la fin .... a ajouté un appel à la sous suivante dans le composant de script:

Sub UpdateLoadLog(ByVal Load_ID As Int32, ByVal Row_Count As Int32, ByVal Row_Percent As Int32, ByVal connstr As String) 
    Dim dbconn As OleDbConnection 
    Dim Sql As String 
    Dim dbcomm As OleDbCommand 

    dbconn = New OleDbConnection(connstr) 
    dbconn.Open() 
    Sql = "update myTable set rows_processed = " & Row_Count & ", rows_processed_percent = " & Row_Percent & " where load_id = " & Load_ID & " and load_log_type = 'SSIS'" 
    dbcomm = New OleDbCommand(Sql, dbconn) 
    dbcomm.ExecuteNonQuery() 

    dbconn.Close() 
    dbconn = Nothing 
    dbcomm = Nothing 
End Sub 

Ceci est exécuté toutes les 1000 lignes, et met à jour avec succès la table. La ligne existait déjà lorsqu'elle a été créée dans le flux de contrôle au début du package, et mise à jour à nouveau dans le flux de contrôle à la toute fin avec le nombre de lignes final et 100%.

Merci pour toutes vos suggestions les gars.

1

Pourquoi ne pas écrire une application .NET et vous pouvez intégrer dans ce pour obtenir des informations pour savoir où le package SSIS est à.

Fondamentalement, tout ce qui est envoyé à la console, vous pouvez obtenir, et il existe des gestionnaires d'événements que vous pouvez attacher pour obtenir des informations pendant le traitement du paquet.

Voici un lien qui peut vous aider à aller avec cette approche: http://www.programminghelp.com/database/sqlserver/sql-server-integration-services-calling-ssis-package-in-c/

4

il y a deux options faciles ici:

Option 1: utiliser la journalisation intégré avec SSIS et regarder le sur événement de progrès. cela peut être configuré pour se connecter à plusieurs sorties différentes, y compris la base de données relationnelle et les fichiers plats

Voir plus Here

Option 2: vous pouvez ajouter un composant de script SSIS qui pourrait déclencher des notifications à un système externe comme une table de base de données

+1

Eh bien, sa question est de savoir comment faire. N'est-ce pas? – Faiz

+0

Jason, merci. J'ai examiné la journalisation. Malheureusement, l'événement OnProgress se déclenche une fois que le flux de données démarre, puis plus jamais. Je ne peux pas voir un autre événement qui se déclenche par ligne ou d'une autre manière tout au long du flux de données. Je commence à penser que l'option 2 est une possibilité. Pouvez-vous suggérer du code pour établir la connexion. Le problème est que, dans un flux de données, il existe un modèle d'objet «rétréci». Des choses comme les Dts. l'objet n'existe tout simplement pas comme dans le flux de contrôle. Utile, je sais. Il est donc difficile de faire fonctionner la connexion à la base de données. Aucune suggestion? –

+0

Voir la dernière mise à jour ci-dessous ... –

0

L'application qui consomme le nombre de lignes est-elle une application .net? Quand il s'agit de partager des informations entre des applications, il y a beaucoup de pratiques acceptées. Peut-être devriez-vous jeter un coup d'œil à eux. Et pour votre cas particulier, si c'est une application .net qui consomme ce numéro de ligne pour calculer la progression, vous pouvez stocker les informations ailleurs que dans une table DB, comme le système de fichiers, le service Web, les variables d'environnement Windows, comme le journal des événements Windows), etc sont certains qui me viennent à l'esprit maintenant. Je pense que la mise à jour d'une variable d'environnement Windows avec un formulaire de nombre de lignes dans votre composant de script sera une bonne solution. Tout comme utiliser une variable globale pour partager des données entre deux fonctions à l'intérieur d'un programme. :)

3

J'ai récemment résolu cela d'une manière légèrement différente, que je trouve supérieur à l'aide de scripts et d'ouvrir des connexions distinctes dans le code pour DB:

  • Dans la requête source ou une forme transformation, ajoutez un nombre de lignes (incrémental)
  • Dans une branche conditionnelle, utilisez une expression modulo (%) pour se ramifier chaque fois que le nombre est un multiple de 1000, mais cela peut être configurable ou basé sur des données source (par exemple 0,0% à 100,0% du données)
  • Créez un gestionnaire de connexion de journal et utilisez une destination. Contrôlez les tailles de lot afin que les lignes soient immédiatement validées dans la table cible.
Questions connexes