Comment puis-je réparer "valeur de caractère non Valide pour la spécification' sur une date dans la colonne fichier plat?
J'ai un fichier CSV avec un {LF} délimitant chaque ligne et d'une colonne de date avec le format de date que "12/20/2010"
(y compris les guillemets)
Ma colonne de destination est un Serveur SQL server 2008 table de base de données de type date (pas datetime)
Dans mon appartement Gestionnaire de connexions de Fichiers, j'ai configuré la date de la colonne type de données date [DT_DATE]
avec TextQualified définie sur true et le délimiteur de colonne comme {LF}
(c'est la dernière colonne de chaque ligne). J'ai le qualificateur de texte mis à "
Quand j'essaye de le charger dans une OLE de Destination, j'obtiens l'erreur suivante
[TRN_DORPS [760]] Erreur: Code d'Erreur SSIS DTS_E_OLEDBERROR. Une erreur OLE DB a eu lieu. Code d'erreur: 0 x 80004005.
Un enregistrement OLE DB est disponible. Source: "le Fournisseur Microsoft OLE DB pour SQL Server" Hresult: 0 x 80004005 Description: "valeur de caractère non Valide pour la spécification.".
[TRN_DORPS [760]] Erreur: Il y a eu une erreur de saisie de la colonne ""CYCLE_DATE"" (874) sur l'entrée "Entrée de Destination OLE DB" (773). La colonne état renvoyé est: "La valeur n'a pas pu être converti en raison d'un risque de perte de données.".
Si j'attache une visionneuse de données, la valeur du pipeline est 2010-12-20 00:00:00.0000000
- est-ce le temps composant de ce qui est à l'origine du problème? J'ai essayer de supprimer le composant avec (DT_DATE)(DT_DBDATE)[CYCLE_DATE]
mais en vain, il demeure le même dans le pipeline
OriginalL'auteur manning18 | 2011-09-02
Vous devez vous connecter pour publier un commentaire.
Afin de simuler le problème que vous rencontrez, j'ai créé l'exemple suivant à l'aide de
SSIS 2008 R2
avecSQL Server 2008 R2
backend. L'exemple est basé sur ce que j'ai recueillies à partir de votre question. Cet exemple ne fournit pas une solution, mais il peut vous aider à identifier où le problème pourrait être dans votre cas.De créer un simple fichier CSV avec les deux colonnes, à savoir le numéro de commande et la date de commande. Comme vous l'avez mentionné dans votre question, les valeurs des deux colonnes sont qualifiés avec des guillemets doubles (") et aussi les lignes à la fin avec un saut de Ligne (\n) avec la date de la dernière colonne. La capture d'écran ci-dessous a été prise à l'aide de Notepad++, qui peut afficher les caractères spéciaux dans un fichier. LF dans la capture d'écran indique la Ligne d'Alimentation.
De créer un simple tableau nommé
dbo.Destination
dans la base de données SQL Server pour remplir le fichier CSV des données à l'aide de packages SSIS. Créer un script pour la table est donnée ci-dessous.Sur le package SSIS, j'ai créé deux gestionnaires de connexion. SQLServer a été créé à l'aide de la Connexion OLE DB à se connecter à la base de données SQL Server. Fichierplat est un plat gestionnaire de connexions de fichiers.
Plat gestionnaire de connexions de fichiers a été configuré pour lire le fichier CSV et les paramètres sont affichés ci-dessous. Les flèches rouges indiquent les modifications apportées.
Fourni un nom pour le fichier plat gestionnaire de connexion. Visionné à l'emplacement du fichier CSV et a choisi le chemin d'accès au fichier. Entré dans le guillemet double (
"
) comme délimiteur de texte. Changé la ligne d'en-Tête délimiteur de {CR}{LF} pour{LF}
. Cette ligne d'en-tête délimiteur de changement se reflète aussi dans la section Colonnes.Aucune modification n'a été faite dans la section Colonnes.
Changé le nom de la colonne à partir de Column0 à
OrderNumber
.Changé le nom de la colonne à partir de Colonne1 à
OrderDate
et a également changé le type de données àdate [DT_DATE]
Un aperçu des données à l'intérieur de l'appartement gestionnaire de connexions de fichiers a l'air bon.
Sur le
Control Flow
onglet du package SSIS, placé unData Flow Task
.À l'intérieur de la Tâche de Flux de Données, placé un
Flat File Source
et unOLE DB Destination
.La
Flat File Source
a été configuré pour lire le fichier CSV des données en utilisant le fichier plat gestionnaire de connexion. Ci-dessous trois captures d'écran montrent comment la source de fichier plat composant a été configuré.La
OLE DB Destination
composant a été configuré pour accepter les données de Source de Fichier Plat et l'insérer dans la base de données SQL Server table nomméedbo.Destination
. Ci-dessous trois captures d'écran montrent comment le fournisseur OLE DB composant de Destination a été configuré.En utilisant les étapes mentionnées dans le dessous de 5 captures d'écran, j'ai ajouté un visualiseur de données sur les flux entre la Source de Fichier Plat et de Destination OLE DB.
Avant d'exécuter le package, j'ai vérifié les données initiales présentes dans la table. Il est actuellement vide, parce que j'ai crée à l'aide du script fourni au début de ce post.
Exécuté le paquet et le paquet d'exécution suspendue temporairement pour afficher les données qui coule de Source de Fichier Plat à Destination OLE DB dans le visualiseur de données. J'ai cliqué sur le bouton run pour procéder à l'exécution.
Le paquet a été exécutée avec succès.
Source de fichier plat de données a été correctement insérée dans la table
dbo.Destination
.Ici est la mise en page de la table dbo.De Destination. Comme vous pouvez le voir, le champ date de Commande est du type de données date et le paquet tout de même continué à insérer correctement les données.
Ce post, même si n'est pas une solution. Nous l'espérons vous aide à trouver où est le problème pourrait être dans votre scénario.
Oh, et merci pour m'enseigner Données de téléspectateurs. Vous venez de m'a sauvé des centaines d'heures de travail.
OriginalL'auteur
J'étais finalement capable de résoudre la solution en définissant le type de colonne dans le fichier plat, une connexion de type "base de données date [DT_DBDATE]"
Apparemment les différences entre ces formats de date sont comme suit:
DT_DATE
Une date de structure qui se compose de l'année, le mois, le jour, et l'heure.
DT_DBDATE
Une date de structure qui se compose de l'année, le mois et le jour.
DT_DBTIMESTAMP
Une structure d'horodatage qui se compose de l'année, mois, heure, minute, deuxième, et de la fraction
En changeant le type de colonne à DT_DBDATE le problème a été résolu - je joint une Visionneuse de Données et la CYCLE_DATE valeur est maintenant tout simplement "12/20/2010" sans une composante temporelle, qui est apparemment résolu le problème.
OriginalL'auteur manning18
Le bon type de données pour "2010-12-20 00:00:00.0000000" la valeur est DATETIME2(7) /DT_DBTIME2 ().
Mais utilisé type de données pour CYCLE_DATE champ est de type DATETIME - DT_DATE. Cela signifie millisecondes précision avec précision chaque troisième ordre de la milliseconde (aaaa-mm-jjthh:mi:ss.mmL où L peut être de 0,3 ou 7).
La solution est de changer CYCLE_DATE type de date à DATETIME2 - DT_DBTIME2.
"MM/dd/yyyy"
. Donc, SSIS essayer de convertir"12/20/2010"
valeur (au lieu de12/20/2010
) àdate[time]
type de données (et il ne parvient pas). Les guillemets sont (plus ou moins) délimiteurs standard pour chaîne/les valeurs de texte. Manning18 essayer de supprimer les guillemets à partir des valeurs de date.Il n'a pas d'importance. Le problème est le même. La source de données peut considérer
"12/20/2010"
valeurDT_STR
(type de données chaîne). Si CYCLE_DATE champ de destination a la DATE[HEURE] type de données puis la conversion de l'erreur d'être soulevées lors de l'étape finale.Pouvez-vous me dire quelle est l'erreur sera généré (et quand) si (1) dans
Flat File Source
laCYCLE_DATE
champ aDT_DATE
type de données, (2) la Source de Fichier Plat n'a pas de délimiteur de texte, mais (3) dansFlat File Source Output -> Output Columns
laCYCLE_DATE
champ aDT_STR
type de données ? Ou, si la Source de Fichier Plat a qualificateur de texte ( " ), mais leCYCLE_DATE
champ (à partir du fichier texte) a certaines valeurs non valides (ex. "12" place de "12/20/2010") ?OriginalL'auteur Bogdan Sahlean