none
Import von CSV Daten bei gleichzeitigem hinzufügen von Kundennummer u.ä. RRS feed

  • Frage

  • Hallo Zusammen,

    ich muss gerelmäßig viele Daten von Kunden in unseren SQl Server importieren die per csv File kommen. Die Felder und das Format der Felder ist immer das gleiche. So weit so einfach. Insofern hab ich mir überlegtd as mit BULK INSERT zu machen.

    BULK INSERT CSVTest FROM 'c:\csvtest.txt' WITH (FIELDTERMINATOR = ',' , ROWTERMINATOR = '\n')
    GO

    Aber, da die Daten von verschiedenen Kunden sind, muss vor jede importierte Zeile auch die von uns festgelegte Kundennummer.  Kann mir jemand sagen, wie ich das machen kann?

    Vielen Dank für Hilfe

    Grüße

    Patrick

     

    Donnerstag, 10. Juni 2010 08:31

Antworten

  • Hallo Patrick
     
    Patrick Pohlmann wrote:
    > ich muss gerelmäßig viele Daten von Kunden in unseren SQl Server
    > importieren die per csv File kommen. Die Felder und das Format der Felder
    > ist immer das gleiche. So weit so einfach. Insofern hab ich mir überlegtd
    > as mit BULK INSERT zu machen.
    >
    > BULK INSERT CSVTest FROM 'c:\csvtest.txt' WITH (FIELDTERMINATOR = ',' ,
    > ROWTERMINATOR = '\n')
    > GOAber, da die Daten von verschiedenen Kunden sind, muss vor jede
    > importierte Zeile auch die von uns festgelegte Kundennummer. Kann mir
    > jemand sagen, wie ich das machen kann?
     
    Wie findest Du die Kundennummer heraus? Liegt diese bereits in der
    Datenbank? Falls ja, kannst Du nach dem BULK INSERT einen Update auf CSVTest
    machen, der die Kundennummer setzt.
     
    UPDATE CSVTest SET KundenNummer = <von Euch festgelegt> WHERE KundenNummer
    IS NULL
     
    Gruss
    Henry
     
     

    [MVP Office Access]
    Mittwoch, 16. Juni 2010 03:22
  • Ich würde das mit einem Zwischenschritt machen. Als erstes dein Import
    in eine Importtabelle und dann als nächstes dann von da der INSERT in
    die eigentliche Tabelle.
     
    INSERT INTO DatenTabelle (Kundennummer, Daten1, Daten2, Daten3, ...)
    SELECT 1234 AS Kundennummer, Spalte1, Spalte2, Spalte3, ... FROM CSVTest
     
    Lutz
     
    Donnerstag, 10. Juni 2010 09:06
  • Hallo Patrick,

    eine weitere Alternative wäre mit OPENROWSET + Bulk Option zu arbeiten, man muss nur zusätzlich eine Format-Datei wie bei bcp dazulegen.
    Ein Beispiel habe ich mal fürs Bankleitzahlenverzeichnis erstellt, der prinziepelle Aufbau für Deinen Fall könnte so aussehen:

    INSERT INTO DeineTabelle

    SELECT 1234 AS [KundenNr]

          ,SRC.*

    FROM OPENROWSET(BULK N'c:\csvtest.txt'

                   ,FORMATFILE = N'c:\csvformat.txt'

                   ,CODEPAGE = 'OEM'

                   ,ERRORFILE = N'c:\csverror.txt'

                   ) AS Src

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 10. Juni 2010 10:04

Alle Antworten

  • Ich würde das mit einem Zwischenschritt machen. Als erstes dein Import
    in eine Importtabelle und dann als nächstes dann von da der INSERT in
    die eigentliche Tabelle.
     
    INSERT INTO DatenTabelle (Kundennummer, Daten1, Daten2, Daten3, ...)
    SELECT 1234 AS Kundennummer, Spalte1, Spalte2, Spalte3, ... FROM CSVTest
     
    Lutz
     
    Donnerstag, 10. Juni 2010 09:06
  • Hallo Patrick,

    eine weitere Alternative wäre mit OPENROWSET + Bulk Option zu arbeiten, man muss nur zusätzlich eine Format-Datei wie bei bcp dazulegen.
    Ein Beispiel habe ich mal fürs Bankleitzahlenverzeichnis erstellt, der prinziepelle Aufbau für Deinen Fall könnte so aussehen:

    INSERT INTO DeineTabelle

    SELECT 1234 AS [KundenNr]

          ,SRC.*

    FROM OPENROWSET(BULK N'c:\csvtest.txt'

                   ,FORMATFILE = N'c:\csvformat.txt'

                   ,CODEPAGE = 'OEM'

                   ,ERRORFILE = N'c:\csverror.txt'

                   ) AS Src

     


    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    Donnerstag, 10. Juni 2010 10:04
  • Hallo Patrick
     
    Patrick Pohlmann wrote:
    > ich muss gerelmäßig viele Daten von Kunden in unseren SQl Server
    > importieren die per csv File kommen. Die Felder und das Format der Felder
    > ist immer das gleiche. So weit so einfach. Insofern hab ich mir überlegtd
    > as mit BULK INSERT zu machen.
    >
    > BULK INSERT CSVTest FROM 'c:\csvtest.txt' WITH (FIELDTERMINATOR = ',' ,
    > ROWTERMINATOR = '\n')
    > GOAber, da die Daten von verschiedenen Kunden sind, muss vor jede
    > importierte Zeile auch die von uns festgelegte Kundennummer. Kann mir
    > jemand sagen, wie ich das machen kann?
     
    Wie findest Du die Kundennummer heraus? Liegt diese bereits in der
    Datenbank? Falls ja, kannst Du nach dem BULK INSERT einen Update auf CSVTest
    machen, der die Kundennummer setzt.
     
    UPDATE CSVTest SET KundenNummer = <von Euch festgelegt> WHERE KundenNummer
    IS NULL
     
    Gruss
    Henry
     
     

    [MVP Office Access]
    Mittwoch, 16. Juni 2010 03:22
  • Hallo Patrick,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Mittwoch, 23. Juni 2010 15:48
    Moderator
  • Vielen Dank für die gute Hilfe. Entschuldigt, dass ich nicht schon früher reagiert habe. Ich komme nach dem Wechsel von den Newsgroups irgendwie noch nicht so gut zurecht hier.

    Ich werde wohl Tatsächlich den Weg über eine Zwischentabelle nehmen. Das scheint mir am einfachsten.

    Vielen Dank und viele Grüße

    Patrick

    Montag, 28. Juni 2010 13:35
  • Hallo Henry,

    das ist ja, wenn ich es mir so recht überlege, eigentlich der eleganteste Weg. Da brauche ich ja nicht mal eine temporäre Tabelle.

    Vielen Dank. So mache ich es.

    Viele Grüße

    Patrick

    Montag, 28. Juni 2010 14:16