SQL SERVER, bulk insert ignorer déformée des lignes
- Je importer SAP unconvered listes. Ces rapports ont l'air assez laid et ne sont pas bien adaptés pour un traitement automatisé. Cependant il n'y a pas d'autre option. Les données sont borderd autour de moins et les symboles de tuyau semblable à l'exemple suivant:
02.07.2012
--------------------
Report name
--------------------
|Header1 |Header2 |
|Value 11|Value1 2 |
|Value 21|Value2 2 |
--------------------
- Je utiliser un format de fichier et une instruction comme suit:
SELECT Header1, Header2
FROM OPENROWSET(BULK 'report.txt',
FORMATFILE='formatfile_report.xml' ,
errorfile='rejects.txt',
firstrOW = 2,
maxerrors = 100 ) as report
Malheureusement je reçois les suivantes code d'erreur:
Msg 4832, Level 16, State 1, Line 1
Bulk load: An unexpected end of file was encountered in the data file.
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)".
La rejette fichier txt contient la dernière ligne du fichier avec juste des inconvénients. L'rejects.txt.Error.Txt documents:
Row 21550 File Offset 3383848 ErrorFile Offset 0 - HRESULT 0x80004005
Le coupable qui déclenche l'erreur est bien évidemment la toute dernière ligne qui ne sont pas conformes au format tel que déclaré dans le fichier de format. Cependant, le laid en-tête ne cause pas de problèmes (au moins celui tout en haut).
Bien que j'ai défini le maxerror attribut très déformée de la ligne tue l'ensemble de l'opération. Si je supprimer manuellement la dernière ligne contenant tout ce que les "moins" ( - ) tout fonctionne bien. Depuis que l'importation sont fréquents et surtout sans surveillance supplémentaire de post-traitement n'est pas sérieux de la solution.
Quelqu'un peut-il m'aider à obtenir sql server pour être moins pointilleux et sensibles respectivement. Il est bon qu'il documents les lignes qui ne pouvait pas être chargé, mais pourquoi faut-il abandonner l'ensemble de l'opération? Et encore plus après une exécution d'une instruction qui a entraîné la création de l'reject.txt pas d'autres (ou les mêmes) instruction peut être exécutée avant que le fichier txt est supprimé manuellement:
Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "rejects.txt" could not be opened. Operating system error code 80(The file exists.).
Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "rejects.txt.Error.Txt" could not be opened. Operating system error code 80(The file exists.).
Je pense que c'est le comportement bizarre. Merci de m'aider à le supprimer.
EDIT - SUIVI:
Voici le format de fichier que j'ai utiliser:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="EMPTY" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100"/>
<FIELD ID="HEADER1" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100"/>
<FIELD ID="HEADER2" xsi:type="CharTerm" TERMINATOR="|\r\n" MAX_LENGTH="100"/>
</RECORD>
<ROW>
<COLUMN SOURCE="HEADER1" NAME="HEADER2" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="HEADER2" NAME="HEADER2" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
Triste de voir qu'il semble vrai que SQL Server n'est tout simplement pas en mesure de gérer une ligne qui n'est pas 100% conforme au format. Pourquoi ne peut-il pas simplement l'ignorer et le journal de la ligne, puis continuer au lieu d'annuler l'ensemble de l'importation immédiatement. Pire encore, une sorte d'erreur de fichier est créé et aussi longtemps que l'on est présent (pas supprimés par l'utilisateur ou un programme externe) pas d'autres à l'importation peut être démarré! N'est-ce pas étrange comportement de logiciel professionnel?
OriginalL'auteur Toby | 2012-07-02
Vous devez vous connecter pour publier un commentaire.
BULK INSERT
est très fastidieux et peu utile quand il s'agit de la manipulation des données qui ne répondent pas à ces spécifications.Je n'ai pas fait beaucoup de travail avec les fichiers de format, mais une chose que vous pourriez envisager comme un remplacement est à l'aide de
BULK INSERT
à goutte de chaque ligne du fichier dans un transfert temporaire de la table avec un seulnvarchar(max)
colonne.Cela vous permet de récupérer vos données en SQL pour un examen plus approfondi, et puis vous pouvez utiliser les différentes fonctions de manipulation de chaînes à briser vers le bas dans les données que vous souhaitez enfin insérer.
Je n'ai pas beaucoup de statistiques sur prétraitement
BULK INSERT
comme ça. Si c'est juste une ligne à la fin du fichier qui est à l'origine du problème, vous pourriez envie de penser à faire un petit utilitaire console de regarder pour cette dernière ligne du fichier et de l'assiette. De cette façon, vous avez quelque chose que vous pouvez envelopper dans du automatisé le processus de téléchargement.C'est en fait à peu près ce que j'ai fait. Pas très charmant! Tous les ennuis seulement en raison des insuffisances de ces deux programmes, SAP ainsi que SQL Server. Je me demande quel produit est le pire? (Personnellement, je vote pour SAP.)
SQL est vraiment à portée de main, mais je pense qu'il se concentre davantage sur les données internes de manutention et laisse au programmeur de développer leurs propres interfaces pour les données d'importation et d'exportation.
OriginalL'auteur lyrisey
J'ai été dans le même problème, mais l'utilisation de la pca de la ligne de commande le problème a été résolu, il s'agit tout simplement de ne pas prendre la dernière ligne
OriginalL'auteur AguilarTovar
J'ai eu le même problème. J'ai eu un fichier avec 115 milliards de lignes afin de supprimer manuellement la dernière ligne n'était pas une option, que je ne pouvais même pas ouvrir le fichier manuellement, comme il était trop grand.
Au lieu d'utiliser la commande d'INSERTION en bloc, j'ai utilisé la commande bcp, qui ressemble à ceci:
(Ouvrez une session DOS cmd en administrateur puis écrire)
C'est la même vitesse que le bulk insert pour autant que je peux dire (m'a fallu que 12 minutes pour importer mes données). Lorsque l'on regarde dans le moniteur d'activité, je peux voir une insertion en bloc, donc je suppose qu'il enregistre la même manière que lorsque la base de données est en vrac en mode de récupération.
OriginalL'auteur Danielle Paquette-Harvey