Problema del terminatore di campo nei file di formato

Ho un file di dati in formato txt e lo caricavo con Bulk Insert nel seguente comando:

Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", ) 

Il codice funziona bene. Tuttavia, mentre cercavo di utilizzare un file di formato con linserimento in blocco per caricare il file, ho riscontrato alcuni problemi nello specificare il terminatore del campo per lultima riga.

Ecco la specifica per lultima riga nel file di formato:

21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS 

Con “0x0a” come terminatore, ottengo il seguente errore:

Errore di conversione dei dati nel caricamento di massa (troncamento) per la riga 2, colonna 1 (var1).

Con “\ n”, i dati possono essere caricato, ma “|” viene caricato anche nellultima colonna. Ad esempio, ottengo “0,5 |” invece di “0,5”.

“| \ n”, “0x0a”, “| 0x0a”, “\ r \ n” restituisce lo stesso errore di “|”

Errore di conversione dei dati di caricamento collettivo (troncamento) per la riga 2, colonna 1 (var1).

I ” m utilizzando sql-server 2016, windows 10 64bit.

Qualcuno può aiutarci? Grazie in anticipo per il vostro aiuto!

Jason

Commenti

  • Dato che ' hai posto alcune domande al riguardo, dai unocchiata a questa pagina: sommarskog.se/bulkload.html
  • @sp_BlitzErik, grazie per la tua risposta! Questo articolo è molto utile e fornisce molte più informazioni rispetto al sito MSDN. Durante la lettura dellesempio in 4.1 , Mi sono confuso con il terminatore di campo " \ " \ r \ n ", la citazione è una nota davvero completa, è un tipo?
  • Se non ricordo male, è ' una sequenza di escape. Se mantieni rea ding lì ' una spiegazione migliore più in basso.

Risposta

Dopo unintera giornata alle prese con il codice Line Feed / Hex, ho finalmente scoperto che il mio problema era causato dalla mancanza di colonne nei file di formato. Il set di dati è nuovo per me e ho pensato che avesse 21 righe mentre in realtà ne ha 22. Ecco perché sql server continuava a caricare lultimo “|” dal file di dati.

Ecco un riferimento per altri forse interessati a caricare file di dati dal sistema UNIX con terminatori di riga diversi da Windows, ce ne sono tre metodi:

  1. utilizza linserimento in blocco e imposta il terminatore di riga come “0x0a”.
  2. utilizza un file di formato e imposta il terminatore di campo dellultimo campo come “\ n “.
  3. Utilizza un sql dinamico con la funzione Char (10) per inserire lavanzamento riga (LF) nella stringa di comando e quindi exec () la stringa di comando.

Prima di provare questi metodi, usa un blocco note per mostrare tutti i caratteri di controllo per confermare i caratteri di controllo usati dai file di testo.

Se nessuno di questi metodi funziona per te, potresti avere altri problemi oltre alla riga terminatore di riga / feed.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *