2011-05-18 8 views
2

Ok, donc je reçois l'erreur suivante, qui semble étrange.SQL Bulk Insert - Mismatch

Msg 4864, niveau 16, état 1, ligne 3 Erreur de conversion de données de charge en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 129, colonne 4 (BirthDay).

Mon fichier CSV est formaté dans le format suivant

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 très bien? Ce qui donne? J'ai tout essayé sous le soleil. Si j'utilise INT comme type de données pour l'import d'anniversaire fonctionne correctement. J'ai essayé alors de CAST et/ou de convertir l'int et j'obtiens évidemment un débordement arithmétique.

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

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

) 
GO 
+1

Vous avez 4 colonnes dans le tableau def mais 5 dans le CSV ...? – gbn

+4

à quoi ressemble la rangée 129? (en fait montrer 127 - 130 s'il vous plaît) –

Répondre

0

Avez-vous vérifié vos paramètres régionaux? Je crois que BCP l'utilisera en essayant d'importer une colonne datetime. Alternativement (et ce que la plupart des gens semblent faire), vous pouvez importer dans une table de transfert en tant que VARCHAR puis faire un INSERT dans votre table réelle avec une instruction CONVERT sur la colonne datetime.

+0

essayé de le convertir. Il ne considère pas cela comme une chaîne, car si j'essaie de le faire, cela me donne aussi un décalage. – GrafixMastaMD

+0

Vous pouvez l'importer en INT ('my_dt_col = CAST (CAST (mon_int_col AS VARCHAR) AS DATETIME)') et ensuite faire la conversion en T-SQL ou un fichier de format pourrait résoudre le problème. –

+0

J'ai regardé mon code, j'ai mis le VARCHAR à peu. J'ai remarqué ceci quand j'ai vérifié l'erreur un peu plus prudente. Merci de m'avoir fait redescendre cette étape. Cela n'avait pas de sens que je ne pouvais pas faire ça. Merci encore. – GrafixMastaMD

0

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

Une autre est que votre instruction SQL a une valeur entière. L'insert CSV peut être traité comme une chaîne; en effet, ce code SQL:

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

Oui, j'avais le genre là aussi à un moment donné. C'était une faute de frappe. Je l'ai là sur mon vrai code. Pardon. – GrafixMastaMD

0

Les fichiers CSV sont presque aussi mauvais que les fichiers XLS et XLST pour contenir de mauvaises données. Je suggérerais de l'ouvrir et de regarder les données dans la rangée référencée et les rangées près d'elles.

+0

J'ai, j'ai même même créé un csv super simple et il a encore échoué. – GrafixMastaMD

+0

Avez-vous des valeurs nulles dans la colonne ID? C'est un champ obligatoire. – HLGEM

0

Je regarderais vos données pour voir ce que vous passez à la ligne 129 pour une date. Je crois que le problème que vous voyez est parce que la date est en dehors de la plage pour une valeur SMALLDATETIME (la plage est du 1er janvier 1900 au 6 juin 2079). Peut-être que l'année a quelques chiffres échangés (par exemple, 9185 au lieu de 1985) ou quelque chose comme ça. Cela aurait du sens alors pourquoi vous obtenez le message "La conversion d'un type de données varchar en un type de données smalldatetime aboutit à une valeur hors de portée" lorsque vous convertissez la date en varchar en premier.

0

Sons comme votre date de naissance ne correspond pas à des exigences smalldatetime (?)

à l'importation comme un int premier (puisque vous savez que les travaux).

alors certaines choses que vous pouvez l'interroger pour
1) longueur où la longueur 2) date de naissance 3) date de naissance> 20790601
(1 Janvier 1900, à 6 Juin, 2079 est le limite de portée)
4) assurez-vous que chaque caractère est un nombre 0-9

puis ...

J'espère que vous n'avez pas à passer par là à chaque fois. Mais pensez à mettre une sorte de validaiton sur le processus de création .csv, si vous le faites.