web-dev-qa-db-fra.com

Erreur de conversion des données de chargement en masse (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 4 (Année)

J'obtiens l'erreur de conversion lorsque j'essaie d'importer un fichier texte dans ma base de données. Ci-dessous le message d'erreur que j'ai reçu:

Erreur de conversion des données de chargement en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 4 (Année).

Voici mon code de requête:

CREATE TABLE Students
(
    StudentNo    Integer NOT NULL Primary Key,
    FirstName    VARCHAR(40) NOT NULL,
    LastName     VARCHAR(40) NOT NULL,
    Year         Integer,
    GPA          Float NULL
);

Voici les exemples de données du fichier texte:

100,Christoph,Van Gerwen,2011
101,Anar,Cooke,2011
102,Douglis,Rudinow,2008

Je pense que je sais quel est le problème..Voilà mon code d'insertion en vrac:

use xta9354
bulk insert xta9354.dbo.Students
from 'd:\userdata\xta9_Students.txt' 
with (fieldterminator = ',',rowterminator = '\n') 

Avec les exemples de données, il n'y a pas de ',' après l'attribut Year, même s'il existe encore un autre attribut Grade après l'année qui est NULL

Quelqu'un peut-il me dire s'il vous plaît comment résoudre ce problème?

15
zoe

Essayez d’utiliser un fichier de format } puisque votre fichier de données ne contient que 4 colonnes. Sinon, essayez OPENROWSET ou utilisez une table intermédiaire.

myTestFormatFiles.Fmt peut ressembler à:

9.0 
 4 
 1 SQLINT 0 3 "," 1 StudentNo "" 
 2 SQLCHAR 0 100 "," 2 Prénom SQL_Latin1_General_CP1_CI_AS 
 3 SQLCHAR 0 100 "," 3 Nom SQL_Latin1_General_CP1_CI_AS. 4 SQLINT 0 4 "\ r\n" 4 ans "

http://i.msdn.Microsoft.com/dynimg/IC45684.gif

Ce tutoriel pour sauter une colonne avec BULK INSERT peut également aider.

Votre déclaration ressemblerait alors à ceci:

USE xta9354
GO
BULK INSERT xta9354.dbo.Students
    FROM 'd:\userdata\xta9_Students.txt' 
    WITH (FORMATFILE = 'C:\myTestFormatFiles.Fmt')
19
Kermit

Dans mon cas, je traitais avec un fichier généré par hadoop sur une boîte Linux. Lorsque j'ai essayé d'importer au format SQL, j'avais ce problème. Le correctif a finalement été d'utiliser la valeur hexadécimale pour le 'saut de ligne' 0x0a. Cela a également fonctionné pour l'insertion en vrac

bulk insert table from 'file' 
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a')
8
Roger

Nous utilisons également l'insert en vrac. Le fichier que nous mettons en ligne est envoyé par un tiers. Après un certain temps de dépannage, j'ai réalisé que leur fichier contenait des colonnes avec des virgules. Juste une autre chose à rechercher ...

2
PPJN

Les options ci-dessus fonctionnent également pour le gros fichier de requête Google. J'ai exporté une table de données vers Goodle Cloud Storage et téléchargé à partir de là. Lors du chargement du même serveur SQL, ce problème était survenu et il pouvait charger le fichier après avoir spécifié le délimiteur 

ROWTERMINATOR = '0x0a' 

Faites également attention à l'enregistrement d'en-tête et spécifiez 

FIRSTROW = 2

Mon dernier bloc pour l'exportation de fichiers de données à partir de google bigquery ressemble à ceci.

BULK INSERT TABLENAME
        FROM 'C:\ETL\Data\BigQuery\In\FILENAME.csv'
        WITH
        (
         FIRSTROW = 2,
         FIELDTERMINATOR = ',',  --CSV field delimiter
         ROWTERMINATOR = '0x0a',--Files are generated with this row terminator in Google Bigquery
         TABLOCK
        )
0
Ratnesh Sharma

Ajout d’un accès complet à MSSQLSERVER aux rôles de dossier, de disque et de serveur bulkadmin.

Dans mon application c #, lors de la préparation de la commande d'insertion en bloc, 

string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM" "+ strFileName +" 'WITH (FIELDTERMINATOR =', ', ROWTERMINATOR ='\n ') ";

Et j’obtiens cette erreur - Erreur de conversion des données de chargement en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 8 (STATUS).

J'ai consulté mon fichier journal et découvert que le terminateur devient "" au lieu de "\ n" . Le fournisseur de base de données OLE "BULK" du serveur lié "(null)" a signalé une erreur. Le fournisseur n'a fourni aucune information sur l'erreur . Impossible d'extraire une ligne du fournisseur de base de données OLE "BULK" pour le serveur lié "(null)". Requête: BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\NEWSTAGEWWW\CalAtlasToPWCR\Résultats\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = ')

J'ai donc ajouté une touche d'échappement supplémentaire à rowterminator - string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM '" + strFileName + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\ n')";

Et maintenant, il insère avec succès . Bulk Insert SQL - ---> BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\NEWSTAGEWWW\CalAtlasToPWCR\Résultats\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',' ROWTERMINATOR = '\ n') Insertion en bloc dans PWCR_Contractor_vw_TEST réussie ... ---> clsDatase.PerformBulkInsert

0
Perry