ticar
Goto Top

BULK INSERT mit Auslassen von Feldern, bzw. ergänzen von Feldern

Hi,

ich würde gerne eine CSV Datei in eine Tabelle laden und die Tabelle hat aber noch zusätzliche Felder für eine spätere Verarbeitung.

Beispiel CSV:
JobDatumEingang;Bestellnummer;Bestellposition;JobDatumDruck;...;Sprache;Gewicht

Zu jedem CSV Feld gibt es eine entsprechende Spalte in der Tabelle. Zusätzlich würde ich aber gerne noch für die spätere Verarbeitung folgende Felder in der Spalte haben und entweder mit NULL oder mit einem festen Wert füllen:

filename (Name des CSV Files)
imported (dient zur späteren Weiterverarbeitung)
ImportDate (dient zur späteren Weiterverarbeitung)

Aktueller Stand der Procedure ist wiefolgt:

DECLARE @cmd0 VARCHAR(400)
DECLARE @bulk_cmd varchar(1000)
DECLARE @inboundpath VARCHAR(400)

/* löschen alter Einträge, falls vorhanden */
DELETE FROM uz_inbound_folder
SELECT @inboundpath = reg_text FROM testDB.dbo.tx_registry WHERE reg_name = 'IP_INBOUND_KRONES'
SET @cmd0 = 'dir ' + @inboundpath + ' /B' INSERT INTO uz_inbound_folder (filename)

/* Lese das Verzeichnis in eine Tabelle ein */
EXEC master..xp_cmdshell @cmd0
/* lösche alle Einträge die ungültig sind */
DELETE FROM uz_inbound_folder WHERE filename IS NULL OR (RIGHT(filename, 3) <> 'csv' AND RIGHT(filename, 3) <> 'CSV' )
IF LEFT(@inboundpath, 1)<>'\' BEGIN SET @inboundpath = @inboundpath +'\' END
/* Ergänze den Dateipfad in der Tabelle */
UPDATE uz_inbound_folder SET filename = @inboundpath + filename

/* Start import der CSV Dateien in Importtabelle */
DECLARE @filename VARCHAR(255)
DECLARE @new_imp_id INT
DECLARE file_cursor CURSOR FOR SELECT filename FROM uz_inbound_folder
OPEN file_cursor

FETCH NEXT FROM file_cursor INTO @filename
WHILE @@FETCH_STATUS = 0
BEGIN
SET @bulk_cmd = 'BULK INSERT testDB.dbo.ut_import FROM '''+@filename+''' WITH (FORMATFILE =''c:\temp\ut_import.fmt'', CODEPAGE=''RAW'', FIELDTERMINATOR ='';'', FIRSTROW=1)'
EXEC(@bulk_cmd)
/* Ergänze Filename zu jeder importierten CSV Zeile */
UPDATE testDB.dbo.ut_import SET filename = @filename WHERE filename IS NULL
FETCH NEXT FROM file_cursor INTO @filename
END

CLOSE file_cursor
DEALLOCATE file_cursor


Das Formatfile sieht dabei so aus (die 3 Spalten habe ich rausgelöscht und den Zähler um 3 Felder von 22 auf 19 verringert
(bcp testDB..ut_import format nul -f c:\temp\ut_import.fmt -c -S STINGRAY\SQL2K8 -U sa -P sql):
9.0
19
1 SQLCHAR 0 20 "\t" 2 JobDatumEingang Latin1_General_CI_AS
2 SQLCHAR 0 20 "\t" 3 Bestellnummer Latin1_General_CI_AS
3 SQLCHAR 0 5 "\t" 4 Bestellposition Latin1_General_CI_AS
4 SQLCHAR 0 20 "\t" 5 JobDatumDruck Latin1_General_CI_AS
5 SQLCHAR 0 5 "\t" 6 Kopien Latin1_General_CI_AS
6 SQLCHAR 0 10 "\t" 7 GesamtSW Latin1_General_CI_AS
7 SQLCHAR 0 10 "\t" 8 GesamtCol Latin1_General_CI_AS
8 SQLCHAR 0 10 "\t" 9 GesamtQM Latin1_General_CI_AS
9 SQLCHAR 0 20 "\t" 10 GesamtPreis Latin1_General_CI_AS
10 SQLCHAR 0 3 "\t" 11 AnzOrdnerBreit Latin1_General_CI_AS
11 SQLCHAR 0 3 "\t" 12 AnzOrdnerSchmal Latin1_General_CI_AS
12 SQLCHAR 0 20 "\t" 13 Materialnummer Latin1_General_CI_AS
13 SQLCHAR 0 20 "\t" 14 Auftragsnummer Latin1_General_CI_AS
14 SQLCHAR 0 30 "\t" 15 AuftragsPosition Latin1_General_CI_AS
15 SQLCHAR 0 255 "\t" 16 Kommission Latin1_General_CI_AS
16 SQLCHAR 0 5 "\t" 17 DokuGruppe Latin1_General_CI_AS
17 SQLCHAR 0 2 "\t" 18 Sprache Latin1_General_CI_AS
18 SQLCHAR 0 255 "\t" 19 Sonderspezifikation Latin1_General_CI_AS
19 SQLCHAR 0 10 "\t" 20 Gewicht Latin1_General_CI_AS


Der CREATE der Tabelle sieht wiefolgt aus:
CREATE TABLE [dbo].[ut_import_krones](
[JobDatumEingang] [dbo].[T_char_20] NULL,
[Bestellnummer] [dbo].[T_char_20] NULL,
[Bestellposition] [dbo].[T_char_05] NULL,
[JobDatumDruck] [dbo].[T_char_20] NULL,
[Kopien] [dbo].[T_char_05] NULL,
[GesamtSW] [dbo].[T_char_10] NULL,
[GesamtCol] [dbo].[T_char_10] NULL,
[GesamtQM] [dbo].[T_char_10] NULL,
[GesamtPreis] [dbo].[T_char_20] NULL,
[AnzOrdnerBreit] [dbo].[T_char_03] NULL,
[AnzOrdnerSchmal] [dbo].[T_char_03] NULL,
[Materialnummer] [dbo].[T_char_20] NULL,
[Auftragsnummer] [dbo].[T_char_20] NULL,
[AuftragsPosition] [dbo].[T_char_30] NULL,
[Kommission] [dbo].[T_char_255] NULL,
[DokuGruppe] [dbo].[T_char_05] NULL,
[Sprache] [dbo].[T_char_02] NULL,
[Sonderspezifikation] [dbo].[T_char_255] NULL,
[Gewicht] [dbo].[T_char_10] NULL,
[FileName] [dbo].[T_char_255] NULL,
[imported] [dbo].[T_boolean] NULL,
[ImportDate] [dbo].[T_datum] NULL
) ON [PRIMARY]

Er meckert mich immer an "Massenladen: Unerwartetes Dateiende in der Datendatei." sprich, das er das mit dem Felder auslassen und dem Formatfile nicht wirklich blickt, oder?

Content-Key: 278563

Url: https://administrator.de/contentid/278563

Printed on: April 18, 2024 at 11:04 o'clock

Member: TiCar
TiCar Jul 28, 2015 at 13:20:29 (UTC)
Goto Top
Oder wäre der bessere Weg die Zeilen gesamt erst mal in eine ##tmp einzulesen und dann per SQL in die Endtabelle zu überführen?

Geht sowas dass man eine Datenzeile, bestehend aus der kompletten Zeile der CSV per SQL so zerlegt, dass diese dann in die ut_import per INSERT INTO übertragen werden kann