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.
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 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
Marquez votre colonne de date en input
Créer une colonne Sortie pour chaque colonne de date
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