web-dev-qa-db-fra.com

Comment contrôler le flux de packages SSIS en fonction du nombre d'enregistrements renvoyés par une requête?

J'essaie d'abord de vérifier s'il y a de nouveaux enregistrements à traiter avant d'exécuter mon package. J'ai un champ de bits appelé "traité" dans une table SQL Server 2008 R2 qui a une valeur de 1 s'il est traité et de 0 sinon.

Je veux l'interroger ainsi:

select count(processed) from dbo.AR_Sale where processed = 0

Si le résultat est 0, je veux envoyer un e-mail disant que les enregistrements ne sont pas là. Si supérieur à zéro, je souhaite procéder à l'exécution du package. Je suis nouveau sur SSIS et je n'arrive pas à comprendre quel outil utiliser pour cela.

Mon package contient un élément de flux de données avec une connexion OLE DB à l'intérieur de la base de données. La connexion utilise une requête pour renvoyer les enregistrements. Malheureusement, la requête se termine avec succès (comme il se doit) même si il n'y a aucun enregistrement à traiter. Voici la requête:

Select * from dbo.AR_Sale where processed = 0

Je copie ces enregistrements dans un entrepôt de données, puis j'exécute une autre requête pour mettre à jour la table source en modifiant le champ traité de 0 à 1.
Toute aide serait grandement appréciée.

14
user1756753

Une option consisterait à utiliser la contrainte de priorité conjointement avec la tâche d'exécution SQL pour obtenir cette fonctionnalité. Voici un exemple de comment y parvenir dans SSIS 2008 R2.

J'ai créé un tableau simple basé sur les informations fournies dans la question.

Créer un script de table :

CREATE TABLE dbo.AR_Sale(
    Id int NOT NULL IDENTITY PRIMARY KEY,
    Item varchar(30) NOT NULL,
    Price numeric(10, 2) NOT NULL,
    Processed bit NOT NULL
) 
GO

Puis rempli la nouvelle table avec quelques exemples de données. Vous pouvez voir que l'une des lignes de l'indicateur Processed est définie sur zéro.

Remplir le script de table :

INSERT INTO dbo.AR_Sale (Item, Price, Processed) VALUES
    ('Item 1', 23.84, 1),
    ('Item 2', 72.19, 0),
    ('Item 3', 45.73, 1);

Sur le package SSIS, créez les deux variables suivantes.

  • Processed du type de données Int32
  • SQLFetchCount de type de données String avec une valeur définie sur SELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0

Variables

Sur le projet SSIS, créez une source de données OLE DB qui pointe vers la base de données de votre choix. Ajoutez la source de données au gestionnaire de connexions du package. Dans cet exemple, j'ai utilisé la source de données nommée comme Practice.

Dans l'onglet Control Flow Du package, faites glisser et déposez Exécuter la tâche SQL à partir de la boîte à outils.

Configurez la page Général de la tâche d'exécution SQL comme indiqué ci-dessous:

  • Donnez un nom correct , dites Check pre-execution
  • Remplacez ResultSet par Single row Car la requête renvoie une valeur scalaire
  • Définissez la connexion sur la source de données OLE DB, dans cet exemple Practice
  • Définissez le SQLSourceType sur Variable car nous utiliserons la requête stockée dans la variable
  • Réglez la Variable Source sur User::SQLFetchCount
  • Cliquez sur la page Result Set Dans la section de gauche

Execute SQL Task - General

Configurez la page Ensemble de résultats de la tâche d'exécution SQL comme indiqué ci-dessous:

  • Cliquez sur le bouton Ajouter pour ajouter une nouvelle variable qui stockera la valeur de comptage renvoyée par la requête
  • Remplacez le Nom du résultat par 0 Pour indiquer la première valeur de colonne renvoyée par la requête
  • Définissez le Nom de la variable sur User::Processed
  • Cliquez sur OK

Execute SQL Task - Result Set

Dans l'onglet Control Flow Du package, faites glisser et déposez la tâche d'envoi de courrier et la tâche de flux de données à partir de la boîte à outils. L'onglet Flux de contrôle doit ressembler à ceci:

Control Flow tab

Cliquez avec le bouton droit sur la flèche verte qui joint la tâche d'exécution SQL et la tâche d'envoi de courrier. Cliquez sur Modifier ... la flèche verte est appelée contrainte de priorité.

Right-click constraint 1

Dans l'éditeur de contraintes de priorité, procédez comme suit:

  • Réglez Opération d'évaluation sur Expression
  • Réglez l'expression sur @[User::Processed] == 0. Cela signifie que prendre ce chemin uniquement lorsque la variable Processed est définie sur zéro.
  • Cliquez sur OK

Equal to zero

Cliquez avec le bouton droit sur la flèche verte qui joint la tâche d'exécution SQL et la tâche de flux de données. Cliquez sur Modifier ... Dans l'éditeur de contraintes de précédence, procédez comme suit:

  • Réglez Opération d'évaluation sur Expression
  • Réglez l'expression sur @[User::Processed] != 0. Cela signifie que prendre ce chemin uniquement lorsque la variable Processed n'est pas définie sur zéro.
  • Cliquez sur OK

Not equal to zero

L'onglet de flux de contrôle ressemblerait à ceci. Vous pouvez configurer la tâche d'envoi de courrier pour envoyer des e-mails et la tâche de flux de données pour mettre à jour les données en fonction de vos besoins.

Control Flow final

Lorsque j'exécute le package avec l'ensemble de données basé sur le script de remplissage de table, le package exécute la tâche de flux de données car une ligne n'est pas traitée.

Data Flow Task logic

Lorsque j'exécute le package après avoir défini l'indicateur Processed sur 1 sur toutes les lignes du tableau à l'aide du script UPDATE dbo.AR_Sale SET Processed = 1, Le package exécute la tâche d'envoi de courrier.

Send Mail Task logic

J'espère que cela pourra aider.

64
user756519

Votre conception SSIS doit être

Src:

Select count(processed) Cnt from dbo.AR_Sale where processed = 0

Étape de partage conditionnel [sous les transformations de flux de données]:

output1: Order 1, Name - EmailCnt, Condition - Cnt = 0
output2: Order 2, Name - ProcessRows, Condition - Cnt > 0

Liens de sortie:

EmailCnt Link: Send email

ProcessRowsLink: DataFlowTask
4
rs.