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

È stato utile?

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)

http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row -constructor /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top