Je dois importer les listes SAP non converties. Ces rapports ont l'air assez moche et ne sont pas bien adaptés au traitement automatisé. Cependant, il n'y a pas d'autre option. Les données sont borderd autour des symboles de moins et de tuyaux similaires à l'exemple suivant:Insertion groupée SQL SERVER ignorer les lignes déformées
02.07.2012
--------------------
Report name
--------------------
|Header1 |Header2 |
|Value 11|Value1 2 |
|Value 21|Value2 2 |
--------------------
J'utilise un fichier de format et une déclaration comme ce qui 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 le code d'erreur follwing:
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)".
Le fichier rejets txt contient la dernière ligne du fichier avec seulement des minuscules. Les documents rejects.txt.Error.Txt:
Row 21550 File Offset 3383848 ErrorFile Offset 0 - HRESULT 0x80004005
Le coupable qui soulève l'erreur est évidemment la dernière ligne qui ne se conforme pas au format tel que déclaré dans le fichier de format. Cependant l'en-tête laid ne cause pas beaucoup de problèmes (au moins celui en haut).
Bien que j'ai défini l'attribut maxerror que toute une ligne déformée tue l'opération entière. Si je supprime manuellement la dernière ligne contenant tous les moins (-) tout fonctionne bien. Étant donné que cette importation doit se dérouler fréquemment et en particulier sans surveillance, le post-traitement supplémentaire n'est pas une solution sérieuse.
Quelqu'un peut-il m'aider à rendre le serveur sql moins sensible et sensible respectivement. Il est bon qu'il documente les lignes qui n'ont pas pu être chargées mais pourquoi avorte-t-il toute l'opération? Et plus loin, après une exécution d'une instruction qui a provoqué la création du reject.txt aucun autre (ou le même) 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 le comportement est bizarre. S'il vous plaît, aidez-moi à le supprimer.
EDIT - FOLLOWUP: Voici le fichier de format que j'utilise:
<?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>
J'ai trouvé un bien meilleur support quand j'utilise un fichier de format avec une largeur de colonne fixe (CharFixed au lieu de CharTerm). Ensuite, vous pouvez vérifier certaines colonnes pour le contenu attendu dans la clause where. Cependant, comme SAP fait varier la largeur de la colonne, ce n'est pas une option dans mon cas d'utilisation. – Toby
Triste de voir qu'il semble vrai que SQL Server n'est tout simplement pas capable de gérer une ligne qui ne respecte pas 100% au format fourni. Pourquoi ne peut-il pas simplement ignorer et enregistrer la ligne, puis continuer au lieu d'abandonner immédiatement l'importation entière. Pire encore, une sorte de fichier d'erreur est créé et tant que celui-ci est présent (pas effacé par l'utilisateur ou le programme externe) aucune importation ne peut être lancée! N'est-ce pas un comportement étrange de logiciel professionnel? – Toby