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?
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 278563
Url: https://administrator.de/contentid/278563
Ausgedruckt am: 24.11.2024 um 09:11 Uhr
1 Kommentar