Inserimento in blocco di SQL Server
-
05-07-2019 - |
Domanda
Voglio importare un file di testo a una colonna in una delle mie tabelle sql. Il file è solo un elenco di parolacce.
Ho scritto il seguente TSQL per farlo
BULK INSERT SwearWords
FROM 'c:\swears.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
Tuttavia, si verifica un errore con la fine del file non prevista. La tabella in cui si importa è solo un campo identità seguito da un campo nvarchar in cui voglio inserire il testo. Funziona bene se aggiungo nel file di testo " 1, " all'inizio della riga eveyr, suppongo che ciò sia dovuto al fatto che SQL cerca 2 campi. C'è un modo per aggirare questo?
Grazie
Soluzione
È necessario utilizzare FORMATFILE per questo. Vedi BULK INSERT .
FORMATFILE [= 'format_file_path']
Specifica il percorso completo di un formato file. Un file di formato descrive i dati file che contiene risposte memorizzate creato usando l'utilità bcp sul stessa tabella o vista. Il file di formato dovrebbe essere usato nei casi in cui:
* The data file contains greater or fewer columns than the table or view. * The columns are in a different order. * The column delimiters vary. * There are other changes in the data format. Format files are usually created by using the bcp utility and modified with a text editor as needed. For more information, see bcp Utility.
Per informazioni più dettagliate, vedere Uso dei file di formato .
Altri suggerimenti
Questo è descritto nei libri on line di BULK INSERT sotto l'argomento KEEPIDENTITY. Ecco cosa si dice
KEEPIDENTITY Specifica che i valori per una colonna identità sono presenti nel file importato. Se non viene specificato KEEPIDENTITY, i valori di identità per questa colonna nel file di dati importati vengono ignorati e SQL Server assegna automaticamente valori univoci basati sul seme e sui valori di incremento specificati durante la creazione della tabella. Se il file di dati non contiene valori per la colonna identità nella tabella o nella vista, utilizzare un file di formato per specificare che la colonna identità nella tabella o nella vista deve essere ignorata durante l'importazione dei dati; SQL Server assegna automaticamente valori univoci per la colonna
Quindi, utilizzare un file di formato o fornire un valore fittizio e assicurarsi di non utilizzare l'argomento KEEPIDENTITY
Inoltre, puoi creare una vista sulla tua tabella basata solo sulla colonna nvarchar, quindi INSERIRE BULK nella tua vista. Questo è un modo molto pulito di usare BULK INSERT.
In questo modo non devi preoccuparti della colonna IDENTITY o della creazione di un file di formato.
La tua dichiarazione BULK INSERT dovrebbe apparire così:
BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n')
Devi assicurarti che la struttura del tuo file di testo e la tabella corrispondano: se la tabella ha due campi, dovrai fornire anche due campi / colonne nel file di testo.
Poiché la prima colonna nella tabella SQL è un campo IDENTITÀ, puoi fornire qualsiasi valore tu voglia - ma devi avere un valore lì, non credo che ci sia alcun modo per aggirare questo.
Marc
Controlla che l'ultima riga abbia CR / LF (\ r \ n). A volte questo è il problema, altre volte un ritorno a capo aggiuntivo è alla fine del file. Puoi verificarlo con un hexeditor.
È possibile rimuovere la colonna identità e reinserirla al termine. In alternativa, se ciò interrompe le relazioni del database, è possibile eseguire l'importazione utilizzando DTS o SSIS se si tratta di un'importazione una tantum: un controllo più granulare del giocherellare con le colonne
In SQL Server 2008 ho trovato più semplice creare un file contenente molti inserti in questo modo e incollarlo nella finestra delle query di Management Studio, piuttosto che lottare per ottenere le autorizzazioni per il file di formato e per l'inserimento di massa nel modo giusto :
USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)