2009-06-16 21 views
4

Ich möchte eine Textdatei mit einer Spalte in eine meiner SQL-Tabellen importieren. Die Datei ist nur eine Liste von Schimpfwörtern.SQL Server Bulk einfügen

Ich habe die folgenden TSQL geschrieben, um diese mit unexapected Ende der Datei

BULK INSERT SwearWords 
FROM 'c:\swears.txt' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 

aber es Fehler zu tun. Die Tabelle, in die importiert wird, ist nur ein Identitätsfeld, gefolgt von einem Nvarchar-Feld, in das ich den Text einfügen möchte. Es funktioniert gut, wenn ich in die Textdatei "1" am Anfang der Eveyr-Zeile hinzufügen, nehme ich an, dies ist, weil SQL, wenn Sie für 2 Felder suchen. Gibt es einen Weg dazu?

Dank

+0

Warum möchten Sie SSIS nicht verwenden? – zvolkov

Antwort

10

Sie müssen FORMATFILE für diesen Einsatz. Siehe BULK INSERT.

FORMATFILE [= 'format_file_path']

Gibt den vollständigen Pfad eines Formats Datei. Eine Formatdatei beschreibt die Daten Datei, die gespeicherte Antworten enthält erstellt mit dem Dienstprogramm bcp auf der gleiche Tabelle oder Sicht. Die Formatdatei sollte in Fällen, in denen verwendet werden:

* 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. 

Weitere Informationen finden Sie Using Format Files.

+0

+1 interessant - danke! Ich wusste nicht, Format-Datei und was sie für eine Masseneinfügung tun könnten - großer Tipp, danke! –

+2

Wie wäre es mit einem Beispiel für eine FORMATFILE zum Einfügen mit einer anderen Anzahl von Spalten? Es ist überraschend schwer, einen zu finden. –

0

Sie müssen sicher die Struktur Ihrer Textdatei und die Tabelle Spiel machen - wenn die Tabelle zwei Felder hat, dann werden Sie zwei Felder/Spalten in der Textdatei als auch zu bieten haben.

Da die erste Spalte in der SQL-Tabelle ein IDENTITY-Feld ist, können Sie jeden gewünschten Wert angeben - aber Sie müssen einen Wert haben, ich glaube nicht, dass es einen Weg gibt.

Marc

+0

ist das nicht genau das, was das OP geschrieben hat ?? –

+0

Im Grunde, ja - aber die OP schien nicht zu wissen, warum .... – RolandTumble

+0

@Stan: Ich könnte geschworen haben zuerst die Post nicht die "BULK" Aussage enthalten - nur "INSERT" - na ja, muss es verpasst haben .... –

0

prüfen die letzte Zeile hat CR/LF (\ r \ n). Manchmal ist das das Problem, manchmal ist ein zusätzlicher Wagenrücklauf am Ende der Datei. Sie können das mit einem Hexeditor überprüfen.

0

Sie können die Identitätsspalte entfernen und sie wieder einfügen, wenn Sie fertig sind. Wenn dies Ihre Datenbankbeziehungen unterbricht, können Sie alternativ den Import mit DTS oder SSIS durchführen, wenn es sich um einen Einmalimport handelt - genauere Kontrolle über das Fangen mit Spalten

1

Sie können auch eine Ansicht auf Ihrer Tabelle basierend nur erstellen die Nvarchar-Spalte und dann BULK INSERT in Ihre Ansicht. Dies ist eine sehr saubere Art, BULK INSERT zu verwenden.

Auf diese Weise brauchen Sie nicht über Ihre Identity-Spalte oder das Erstellen einer Formatdatei zu kümmern.

Ihre Anweisung von Bulk sollte wie folgt aussehen:

BULK INSERT vw_SwearWords FROM 'c:\swearwords.txt' WITH (ROWTERMINATOR = '\n') 
2

Dies ist in Büchern auf der Linie für Bulk unter dem KEEPIDENTITY Argumente beschrieben. Hier ist, was gesagt wird

KEEPIDENTITY Gibt an, dass die Werte für eine Identitätsspalte in der importierten Datei vorhanden sind.Wenn KEEPIDENTITY nicht angegeben wird, werden die Identitätswerte für diese Spalte in der importierten Datendatei ignoriert, und SQL Server weist automatisch eindeutige Werte basierend auf den Start- und Inkrementwerten zu, die bei der Tabellenerstellung angegeben wurden. Wenn die Datendatei keine Werte für die Identitätsspalte in der Tabelle oder Sicht enthält, verwenden Sie eine Formatdatei, um anzugeben, dass die Identitätsspalte in der Tabelle oder Sicht beim Importieren von Daten übersprungen werden soll. SQL Server ordnet automatisch eindeutige Werte für die Spalte

also entweder eine Formatdatei verwenden oder einen Dummy-Wert liefern und sicherstellen, dass nicht das KEEPIDENTITY Argument verwenden

0

In SQL Server 2008 Ich habe festgestellt, es einfacher dass in Management Studio des Abfragefenster zu erstellen, eine Datei viele Einsätze wie so enthält, und fügen Sie sich, anstatt zu kämpfen mit der Format-Datei und Bulk-Dateiberechtigungen immer genau richtig:

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/

Verwandte Themen