2013-02-20 8 views
1

J'ai un fichier séparé par des virgules csv contenant des centaines de milliers d'enregistrements dans le format suivant:SQL en vrac Insérez CSV

3212790556,1,0.000000,,0 
3212790557,2,0.000000,,0 

Maintenant, en utilisant la méthode de fichier plat d'importation SQL Server fonctionne dandy. Je peux éditer le sql de sorte que le nom de table et les noms de colonne aient quelque chose de significatif. De plus, j'édite aussi le type de données de la valeur par défaut varchar (50) à int ou décimal. Tout cela fonctionne très bien et l'import SQL est capable d'importer avec succès.

Cependant, je ne peux pas faire ce même tâche en utilisant le bloc Insérer une requête qui est la suivante:

BULK 
INSERT temp1 
FROM 'c:\filename.csv' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 
GO 

Cette requête renvoie les 3 erreurs suivantes que je ne sais pas comment résoudre:

Msg 4866, Level 16, State 1, Line 1 
The bulk load failed. The column is too long in the data file for row 1, column 5. Verify that the field terminator and row terminator are specified correctly. 
Msg 7399, Level 16, State 1, Line 1 
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error. 
Msg 7330, Level 16, State 2, Line 1 
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)". 

Le but de mon application est qu'il y a plusieurs fichiers CSV dans un dossier qui doivent tous remonter dans une seule table afin que je puisse interroger pour la somme des valeurs. En ce moment je pensais écrire un programme en C# qui exécutera l'insertion BULK dans une boucle (selon le nombre de fichiers) et ensuite revenir avec mes résultats. Je suppose que je n'ai pas besoin d'écrire un code et que je peux juste écrire un script qui fait tout cela - tout le monde peut me guider vers le bon chemin :)

Merci beaucoup.

Edit: vient d'ajouter

ERRORFILE = 'C:\error.log' 

à la requête et j'obtiens 5221 lignes insérées. Quelques fois son 5222 quelques fois son 5222 mais il échoue juste au-delà de ce point. Ne sais pas quel est le problème ??? Le CSV est parfaitement bien.

Répondre

2

SOB. WTF !!!

Je ne peux pas croire que remplacer \ n avec "0x0A" dans le ROWTERMINATOR travaillé !!! Je veux dire sérieusement. Je l'ai juste essayé et ça a marché. WTF moment !! Totalement.

Cependant, ce qui est un peu intéressant, c'est que l'assistant d'importation SQL aussi seulement environ 10 secondes secondes à importer. La requête d'importation a pris plus d'une minute. Des suppositions?

+0

Je ne sais pas avec certitude, mais cela me semble être un bug. MS n'a peut-être pas testé en spécifiant 'ROWTERMINATOR = '\ n'' puisque \ n est la valeur par défaut. Je parie que cela fonctionnerait si vous preniez la clause ROWTERMINATOR. En ce qui concerne la différence de performance, que se passe-t-il si vous ajoutez une clause BATCHSIZE? Je suis sûr que l'assistant d'importation en utilise un. –