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?
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')
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')
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 ...
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
)
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