web-dev-qa-db-fra.com

Flux de données SSIS pour mettre à jour les lignes de la table source après la copie à la destination

J'ai un flux de données simple qui copie un sous-ensemble de données à partir d'une table source sur une base de données interne à une table sur la base de données sur le Web.

S'il y a un problème, l'erreur est émise à une table d'erreurs.

C'est tout bien.

Dans la table source, il y a une colonne de bits pour SSIS_TRANSFERRED que je souhaite définir sur 1 lorsque le processus de copie se termine. Cependant, je ne suis pas sûr comment aborder cela.

Mon instinct est d'élaborer une instruction SQL qui fonctionne contre chaque identifiant unique pour chaque ligne transférée avec succès dans le cadre de ce forfait - y a-t-il une approche simple (c'est-à-dire dans le cadre du flux de données) ou dois-je créer un nouveau contrôle Flow with OLE commande DB qui interroge la table en ligne et marque les lignes internes correspondantes comme "transféré" en conséquence?

enter image description here

4
Chris Currie

Si vous souhaitez conserver tous les composants dans la tâche du flux de données actuel, vous pouvez ajouter une multicast dans cette tâche de flux de données, avec une sortie à la destination et l'autre sortie à un OLE DB Commande qui met à jour les enregistrements source en fonction des lignes transférées sur la destination. Toutefois, la transformation de la multidiffusion est une transformation synchrone, les enregistrements vont donc aux deux sorties simultanément et cela pourrait entraîner des problèmes de blocage ou d'impasse. Une approche plus simple peut être de simplement Ajoutez une tâche SQL Execute après la tâche de flux de données qui met à jour la table source en fonction des enregistrements transférés de la table de destination. Pour la mise à jour, vous souhaitez effectuer une mise à jour basée sur les paramètres, telle que l'instruction SQL ci-dessous. Pour seulement Effectuer cette mise à jour basée sur les lignes transférées dans cette exécution de l'emballage, une multicast pourrait être utilisée dans la tâche de flux de données pour produire uniquement les ID uniques à une table d'intervention, puis mettez à jour la source en fonction des identifiants correspondants de la table d'étage de la Exécution ultérieure tâche SQL. Assurez-vous simplement d'ajouter une étape pour tronquer la table de mise en scène au début de l'emballage pour effacer les données de l'exécution antérieure.

UPDATE SRC
SET SRC.SSIS_TRANSFERRED = 1
FROM dbo.SourceTable SRC
INNER JOIN dbo.DestinationTable DEST 
ON SRC.ID = DEST.ID
0
userfl89

Avec t-sql il y a un output insertedclause qui serait vraiment utile dans ce scénario.

Je ne suis pas au courant d'un moyen de le faire avec SSIS, donc votre approche alternative d'utiliser un deuxième flux de données après votre premier (vous pouvez connecter le second flux de données à la première fois que votre dépendance sera honorée), interrogeant la base de données Web. et mettre à jour le système interne selon le cas fonctionnera tant que votre charge de travail peut tolérer la latence supplémentaire impliquée dans l'attente de mettre à jour le SSIS_TRANSFERRED colonne.

2
Mark Iannucci

Comme @ @mark Iannucci dit, la clause de sortie sera votre ami ici.

La requête suivante démontre l'approche.

-- Just setup junk
DECLARE
    @SRC TABLE
(
    SSIS_TRANSFERRED bit
,   col2 int
)
;

INSERT INTO
    @SRC
(
    SSIS_TRANSFERRED
,   col2
)
SELECT TOP 100
    0 AS SSIS_TRANSFERRED
,   CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS int) AS col2
FROM
    sys.all_columns AS AC;


-- This is what you will use in your Source component
-- Copy this logic into your component
UPDATE SRC
SET SRC.SSIS_TRANSFERRED = 1
OUTPUT Deleted.*
FROM @SRC SRC
WHERE SRC.SSIS_TRANSFERRED = 0;

Comment cela fonctionne, est qu'il mettra à jour vos données source. C'est une opération atomique - elle fait ou pas. S'il met à jour une ligne, il est émis sur les tampons SSIS et s'écoulera vers votre destination. Si quelque chose de mauvais arrive, la transaction souffle et aucune donnée n'est ajoutée au tampon.

Notez que j'utilise la table virtuelle Deleted avec la valeur d'origine de 0 pour SSIS_TRANSFERRED. Si j'ai sélectionné Inserted, alors j'aurais des lignes avec une valeur 1. Quel est le comportement attendu de votre cible à vous de décider.

2
billinkc