così ho dovuto risolvere per un po 'di tempo un problema di perplessità con BULK INSERT. I file provengono da una scatola Linux e quando li guardo in modalità esadecimale/notepad ++ sembrano avere solo un linefeed (0A) come terminatore di riga. Conservo le istruzioni di inserimento in blocco in una tabella che in seguito seleziona un lavoro e esegue l'istruzione nella tabella per caricare i dati in una tabella di staging.Inserimento di massa - Terminatore di riga per il file UNIX + Terminatore di riga " l"
Il caso particolare che mi lascia perplessi è una tabella con 7 colonne. Il file di dati ha solo le prime 4 colonne, il resto deve essere lasciato NULL.
Tipicamente essi simile a questa:
BULK INSERT STAGING_TABLE FROM 'FILE_LOCATION'
WITH (
DATAFILETYPE = 'widechar'
, FIELDTERMINATOR = ','
, ROWTERMINATOR = 'something_here'
);
La fila terminatore è stata la più grande fonte di miei problemi.
Quando provo a utilizzare "\ n" l'inserto di massa non riesce su un errore di troncamento, sembra trattare il file come una stringa lunga e delimita le colonne correttamente solo fino a quando non esaurisce le colonne (quindi errore di troncamento) .
Quando utilizzo "0x0a", l'inserimento di massa non riesce sull'errore "fine del file inaspettato". C'era una riga vuota alla fine del file, ma anche quando l'ho rimosso ha gettato ancora lo stesso errore, quindi non sono sicuro di cosa c'è che non va.
L'UNICO finora che ha lavorato per ottenere i dati effettivamente nella tabella era "\ l". Qualcuno sa cosa significa? Ho cercato in lungo e in largo ma non sembra esserci documentazione su di esso. Quello o io ho cercato completamente nel posto sbagliato.
La cosa strana con \ l come rowterminator è che anche se viene caricato correttamente, non rispetta ancora il rowterminator ... Le righe vengono semplicemente caricate in tutte e 7 le colonne e divise in intervalli apparentemente casuali.
Qualcuno ha qualche idea? Dovrei chiarire un po 'di più?
Grazie, i suggerimenti alternativi che hai fatto hanno finito per essere in grado di risolvere il mio problema. È stato sicuramente il fatto che ho colonne diverse tra il file di dati e la tabella di staging. Sono stato confuso da questo però perché ci sono molti altri processi strutturati in questo stesso esatto modo di funzionare correttamente nonostante abbiano anche colonne non corrispondenti. In ogni caso tutto ha funzionato. Grazie! –
@RazzleDazzle Sono contento che abbia funzionato! Per quanto riguarda gli altri processi simili che funzionano, sei sicuro che a) stanno usando 'BULK INSERT' e non qualcosa come' OPENROWSET (BULK ...) 'o' BCP.EXE', e b) se stanno usando ' BULK INSERT', che non usano anche un file di formattazione? Non vedo come sia possibile che possano lavorare con 'BULK INSERT' pur avendo un diverso numero di colonne e nessun file di formato, a meno che quelle colonne non siano IDENTITY o qualcosa del genere (che non può essere inserito in). PS, quale vera soluzione hai finito con? Semplicemente curioso :) –
@RazzleDazzle Solo FYI: ho appena testato di nuovo con una colonna in più nella tabella di destinazione. Ho provato sia come 'DATETIME NOT NULL DEFAULT (GETDATE())' che come 'INT NOT NULL IDENTITY (1, 1)' ed entrambi non sono riusciti a causa della mancata corrispondenza nel numero di colonne. Quindi non si è sicuri di come quegli altri processi funzionino senza un file di formattazione o usando qualcosa di diverso da "BULK INSERT". –