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.
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
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:
Check pre-execution
Single row
Car la requête renvoie une valeur scalairePractice
Variable
car nous utiliserons la requête stockée dans la variableUser::SQLFetchCount
Result Set
Dans la section de gaucheConfigurez la page Ensemble de résultats de la tâche d'exécution SQL comme indiqué ci-dessous:
0
Pour indiquer la première valeur de colonne renvoyée par la requêteUser::Processed
OK
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:
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é.
Dans l'éditeur de contraintes de priorité, procédez comme suit:
Expression
@[User::Processed] == 0
. Cela signifie que prendre ce chemin uniquement lorsque la variable Processed est définie sur zéro.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:
Expression
@[User::Processed] != 0
. Cela signifie que prendre ce chemin uniquement lorsque la variable Processed n'est pas définie sur zéro.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.
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.
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.
J'espère que cela pourra aider.
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