Fichier plat SSIS impossible de convertir en SQL datetime2

J'ai créé un SSIS en cours d'exécution et j'ai essayé d'insert des données sans erreur à SQL Server mais soudainement ce message d'erreur apparaît

Erreur: 0xC02020A1 à la tâche de stream de données, source de file plat [59]: la conversion de données a échoué. La conversion de données pour la colonne "SCB_ActualDTime" a renvoyé la valeur d'état 2 et le text d'état "La valeur n'a pas pu être convertie en raison d'une perte potentielle de données.".

Il dit que l'erreur s'est produite dans la ligne 8 contenant ces données de la

SCB_ActualDTime 2017-04-16 15:28:07 

C'est vraiment bizarre car j'ai essayé d'insert les mêmes données via un script SQL et il n'y a pas de message d'erreur.

Flat File n'est pas une source de données qui force un type de données spécifique pour chaque colonne. il peut donc contenir des caractères Unicode ou des espaces blancs qui empêchent la lecture de la colonne en tant que Datetime.

Après avoir travaillé avec de nombreux cas, j'ai décidé de travailler avec un file plat de cette façon.

  • Dans le Flat File Connection Manager je vais lire toutes les colonnes en tant DT_STR colonne DT_STR sans spécifier d'autres types de données
  • Dans la DataFlow Task , j'appendai un composant de script pour vérifier si la valeur des colonnes peut être convertie en le type de données estimé, puis convertie

En supposant que le nom de la colonne de date est inColumn

Dans la DataflowTask, ajoutez un composant de script, Mark inColumn comme colonne d'input, ajoutez une nouvelle colonne de sortie outColumn avec dataType DT_DBTIMESTAMP

Changer le langage de script en vb.net

entrez la description de l'image ici

Marquez votre colonne de date en input

entrez la description de l'image ici

Créer une colonne Sortie pour chaque colonne de date

entrez la description de l'image ici

Dans le script, dans Input0_ProcessInputRow utilisez la fonction DateTime.ParseExact comme suit:

Dans cet exemple, la colonne de date est MailReceivingDate

  Public Class ScriptMain Inherits UserComponent Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) If Not Row.MailReceivingDate_IsNull AndAlso Not Ssortingng.IsNullOrEmpty(Row.MailReceivingDate.Trim) Then Dim dtDate as Date If DateTime.TryParseExact(Row.MailReceivingDate.Trim, "yyyy-MM-dd HH:mm:ss", New System.Globalization.CultureInfo("en-GB"),System.Globalization.DateTimeStyles.None,dtDate) Then Row.OutColumn = dtDate Else 'If column cannot be parsed Row.outColumn_IsNull = True End If Else Row.outColumn_IsNull = True End If End Sub End Class