3 votes

SQL Bulk Insert -- Incompatibilité

D'accord, je reçois l'erreur suivante, qui semble étrange.

Msg 4864, Niveau 16, État 1, Ligne 3 Chargement en masse erreur de conversion des données (type incompatible ou caractère non valide pour la page de code spécifiée) pour la ligne 129, colonne 4 (BirthDay).

Mon fichier CSV est formaté de la manière suivante

1, Aaron, Aaberg, 19700926, MALE

Mais si je fais ce qui suit:

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender)
VALUES ('1' 'Test', 'Me', 19851118, 'Male')

Fonctionne bien? Qu'est-ce qui se passe? J'ai tout essayé. Si j'utilise INT comme type de données pour Birthday, l'importation fonctionne bien. J'ai essayé ensuite de CAST et/ou CONVERT l'entier et j'obtiens évidemment un dépassement arithmétique.

J'ai oublié de vous donner le code de la table:

CREATE TABLE Test.BulkInsert (ID int NOT NULL,
                  FirstName VARCHAR(40),
                  LastName VARCHAR(40),
                  BirthDay SMALLDATETIME,
                          Gender VARCHAR(6)

)
GO

1voto

Tom H Points 40298

Avez-vous vérifié vos paramètres régionaux? Je crois que BCP les utilisera lors de la tentative d'importation d'une colonne de date/heure.

Alternativement (et ce que la plupart des gens semblent faire), vous pouvez importer dans une table de mise en scène en tant que VARCHAR puis effectuer un INSERT dans votre table réelle avec une instruction CONVERT sur la colonne datetime.

0voto

Ted Hopp Points 122617

Une possibilité (ou peut-être une faute de frappe dans votre publication) : votre table a quatre colonnes; votre ligne CSV contient cinq valeurs.

Une autre possibilité est que votre instruction SQL a une valeur entière. L'insertion CSV peut la traiter comme une chaîne de caractères; en effet, cet SQL :

INSERT INTO Test.BulkInsert (FirstName, LastName, Birthday, Gender)
VALUES ('1' 'Test', 'Me', '19851118', 'Male')

0voto

HLGEM Points 54641

Les fichiers CSV sont presque aussi mauvais que les fichiers XLS et XLST pour contenir des mauvaises données. Je suggérerais d'ouvrir le fichier et d'examiner les données de la ligne référencée et des lignes voisines.

0voto

BiggsTRC Points 10362

Je regarderais vos données pour voir ce que vous transmettez à la ligne 129 pour une date. Je crois que le problème que vous rencontrez est dû au fait que la date se situe en dehors de la plage de valeurs d'un SMALLDATETIME (la plage va du 1 janvier 1900 au 6 juin 2079). Peut-être que l'année a quelques chiffres inversés (par exemple, 9185 au lieu de 1985) ou quelque chose du genre. Cela expliquerait pourquoi vous obtenez le message "La conversion d'un type de données varchar en un type de données smalldatetime a donné une valeur hors plage" lorsque vous convertissez d'abord la date en varchar.

0voto

宮本 武蔵 Points 5712

Il semble que votre date de naissance ne corresponde pas aux exigences de smalldatetime (?)

Importez-la d'abord en tant qu'entier (puisque vous savez que cela fonctionne).

puis quelques choses que vous pourriez interroger
1) longueur où la longueur < 8
2) date de naissance < 19000101
3) date de naissance > 20790601
(du 1er janvier 1900 au 6 juin 2079 est la limite de la plage)
4) assurez-vous que chaque caractère est un chiffre de 0 à 9

et ensuite...

espérons que vous n'ayez pas à refaire cela chaque fois. Mais envisagez de mettre en place une sorte de validation lors du processus de création du .csv, si nécessaire.

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