3
votes

Sélectionnez les lignes écrites lors des tâches de journalisation des erreurs SSIS

Si j'essaie d'insérer deux lignes non distinctes à l'aide de SSIS dans une table avec une clé primaire, comment puis-je déterminer quelle ligne est écrite dans la table et laquelle est gérée par la tâche de journalisation des erreurs?

Par exemple, J'ai une table de destination avec deux colonnes et une contrainte de clé primaire et j'essaie d'insérer deux lignes de la table source qui ont les mêmes valeurs mais aucune contrainte de clé primaire.

| KeyColumn  |   TextColumn  |
|     1      | 'ValidRecord' |
|     1      |'InvalidRecord'|
|     2      | 'ValidRecord' |

Si j'ai deux lignes qui ont la même clé primaire, essayer d'insérer les deux ferait planter le package SSIS, mais si j'ajoute une journalisation des erreurs pour enregistrer la ligne en double, j'ai 1/2 chance de journaliser l'enregistrement incorrect

(KeyColumn UNIQUEIDENTIFIER NOT NULL, TextColumn VARCHAR(50) NULL)

À condition que je puisse déterminer systématiquement l'enregistrement valide (par exemple: TextColumn ne doit jamais contenir le texte 'Invalid' ) comment puis-je créer une tâche SSIS pour toujours écrire l'enregistrement correct dans ma table SSIS et envoyer l'enregistrement incorrect à la tâche de journalisation?


2 commentaires

Vérifiez que les données source peuvent aller dans la table de destination avant d'essayer d'insérer des enregistrements. Cela inclurait la détection des clés en double dans la source et la vérification pour voir si les clés source sont déjà dans la table de destination. Oui, les erreurs doivent encore être gérées dans le processus d'insertion, mais la validation des données source vous mettra en avance dans le jeu.


La raison pour laquelle je poste ceci est de savoir comment gérer une exception. Cette clé primaire à laquelle je fais référence dans l'exemple simplifié ici est en fait une clé composée de plusieurs colonnes du serveur source; Il est presque impossible de détecter dans la source. Si j'avais pu valider les données dans la table source, j'aurais.


3 Réponses :


0
votes

Dans l'éditeur de destination OLEDb, il y a des lignes par lot, vous pouvez y entrer 1. Ensuite, lorsque SSIS échoue, vous obtiendrez l'enregistrement sur lequel il a échoué.

Sur une note similaire - Dans le tableau que vous avez fourni, la colonne clé ne peut pas avoir deux lignes avec la même valeur de 1. Vous devriez être en mesure de gérer ce problème dans votre table intermédiaire.

Un addtl. La façon de gérer cela est de faire une recherche sur la colonne clé et de détourner les clés existantes vers une autre tâche.


3 commentaires

J'ai déjà désactivé le chargement rapide (définit automatiquement Rows Per Batch sur 1). Pour clarifier, j'ai déjà créé les tâches de sortie d'erreur. La question est de savoir où je peux déterminer quelles lignes sont écrites dans la table et lesquelles sont enregistrées lorsqu'il y a deux clés primaires en double. La recherche ne résout pas ce problème car elle gère les lignes premier arrivé, premier servi plutôt que par contenu de ligne.


Je vois une contradiction inhérente à votre approche. Les clés primaires ne peuvent pas être dupliquées. Par conséquent, dans les processus etl, ce problème est généralement pris en charge avant d'insérer les lignes. J'ai également une compréhension limitée du scénario complet. Avez-vous essayé de créer une sortie d'erreur à partir de la destination en utilisant la ligne de redirection vers une table d'erreurs? Ensuite, vous pouvez créer un processus stocké pour envoyer des e-mails, etc. à partir de cette table.


Je mettrai à jour le message pour être plus clair. Cette question est de savoir quoi faire lorsque votre source a deux valeurs en double mais que la destination ne peut pas gérer cela. La ligne redirigée est en fait définie sur une table d'exception, mais je ne l'ai pas incluse dans le message car je ne voulais pas trop compliquer les choses.



0
votes

Si vous pouvez déterminer de manière cohérente quelles lignes sont bonnes ou mauvaises, vous pouvez utiliser un fractionnement conditionnel et écrire une expression pour détourner les lignes en fonction de l'expression. C'est le moyen le plus simple de s'en sortir.


0 commentaires

1
votes

Vous pouvez y parvenir en utilisant 2 approches:

(1) Utilisation d'un composant de script

Si vous avez besoin de vérifier les doublons en fonction de la KeyColumn (la première occurrence est valide, les autres ne sont pas valides), vous peut utiliser un composant de script pour y parvenir.

  1. Tout d'abord, ajoutez 1 colonne de sortie de type DT_BOOL (exemple de nom: indicateur)
  2. Dans le script, utilisez un script similaire:

    FINDSTRING([TextColumn],'InvalidRecord',1) == True
    
  3. Ajoutez un fractionnement conditionnel pour fractionner les lignes en fonction de la valeur de la colonne Flag , en utilisant une expression similaire:

    [Flag] == True
    
  4. Mappez le chemin True vers la table de destination et le chemin False vers la destination de journalisation des erreurs

(2) Utilisation d'un fractionnement conditionnel

Si vous pouvez vérifier si le orw est valide en fonction de la colonne de texte, vous pouvez ajouter un fractionnement conditionnel avec l'expression suivante: p>

using System.Collections.Generic;

public class ScriptMain:  
    UserComponent  

{  

    List<string> lstKey = new List<string>;

    public override void Input0_ProcessInputRow(InputBuffer0 Row)  
    {  

        if(!lstKey.Contains(Row.KeyColumn.ToString()){

            lstKey.Add(Row.KeyColumn.ToString());
            Row.Flag = true;

        }else{

            Row.Flag = false;

        }

    }  

}


0 commentaires