3 votes

TryParse SSIS Ignorer la ligne source

J'ai un code sérialisé, et à l'intérieur de ce code il y a des valeurs numériques qui, lorsqu'elles sont analysées, représentent une date.

For example, 011756420176654 
*Note* array index may be off
Substring(1,2) = 01
Substring(3,2) = 17

J'essaie d'ignorer la ligne, sans remplacer la ligne d'origine. J'ai une colonne dérivée et je fais cela dans la colonne.

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + (dt_str,10,1252)datepart("year",getdate()))

Mon intention est de configurer ma sortie d'erreur pour qu'elle ignore le champ [Mon code] si la logique "TryParse" de la colonne dérivée échoue. Je sais que si je passe la colonne dérivée, le fait de sélectionner ignore dans la configuration passera null, mais le problème est que j'essaie (en cas d'erreur) d'ignorer la ligne source et de la passer en tant que null (c'est-à-dire [Mon Code]).

Une fois que la base de données est atteinte, un autre processus la consomme et tente d'analyser les dates. Il n'échouera pas sur des valeurs nulles, donc je veux valider que essentiellement "est une date"-logique avant d'autoriser l'enregistrement, ou de le mettre à null.

Edit : Per Keith's solution, I came to this. J'avais des problèmes pour accéder au tampon de sortie, mais après avoir consulté MSDN sur la syntaxe, j'ai trouvé ce qui suit et qui fonctionne parfaitement.

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        DateTime dateValue;
        string test = Row.ReceiptCode.Substring(0, 2) + "/" + Row.ReceiptCode.Substring(2, 2) + "/" + DateTime.Now.Year.ToString();

        if (DateTime.TryParse(test, out dateValue) && Row.ReceiptCode.Length ==16)
    {

        Output0Buffer.AddRow();

        Output0Buffer.EndDate = Row.EndDate;
        Output0Buffer.Q10 = Row.Q10;
        Output0Buffer.Q8 = Row.Q8;

        Output0Buffer.ValidatedReceipt = Row.ReceiptCode;
    }
    else 
    {
        Output1Buffer.AddRow();

        Output1Buffer.EndDate = Row.EndDate;
        Output1Buffer.Q10 = Row.Q10;
        Output1Buffer.Q8 = Row.Q8;
        Output1Buffer.Error = Row.ReceiptCode;
    }
}

3voto

KeithL Points 2607

J'utiliserais une transformation script :

Ajoutez une colonne de sortie (convDate) et cochez [Mon code] comme lu :

Voici votre code :

string test = Row.[My Code].Substring(1,2) + "/" + Row.[My Code].Substring(3,2)+"/" + DateTime.Now.Year.ToString();

if (DateTime.TryParse(test, out dateValue))
{Row.convDate = dateValue;  }

2voto

Hadi Points 16319

C'est mieux (du point de vue de la performance) pour éviter d'utiliser le composant script lors de l'utilisation d'une simple expression

Le problème que vous rencontrez dans votre expression de colonne dérivée est qu'il vous manque le deuxième tiret - et préciser 50 comme longueur de la chaîne, essayez d'utiliser l'expression suivante :

(dt_date)(Substring([My Code], 1, 2) + "-" + Substring([My Code], 3, 2) + "-" +  (dt_str,50,1252)datepart("year",getdate()))

Il est également préférable d'utiliser le formatage universel des dates YYYY-MM-DD lors du traitement des valeurs de date :

(dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))

Assurez-vous que vous avez configuré la sortie d'erreur pour ignorer l'échec :

enter image description here


Mise à jour 1

Si vous devez renvoyer la valeur de la chaîne originale, utilisez l'expression suivante :

((dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2)) == (dt_date)((dt_str,50,1252)datepart("yy",getdate()) + "-" + Substring([My Code], 3, 2) + "-" + Substring([My Code], 1, 2))) 
? [My Code] 
: NULL(dt_str,50,1252)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X