none
bulk insert RRS feed

  • Frage

  • Guten Abend,

    ich habe zwei Fragen zum bulk insert.

    1. Ich bekomme mehrere Dateien geliefert, die ich mit bulk insert einlesen möchte. Allerdings kann bei den regelmäßigen Lieferungen eine (oder mehrere) dieser Dateien auch ausbleiben, wenn in der Periode keine Datensätze verarbeitet wurden. Nun möchte ich nicht, dass deshalb das Einlesen der weiteren Dateien mit einem Fehler abbricht, sondern der bulk insert für diese Datei(en) übersprungen wird. Wie wäre das möglich?

    2. Innerhalb der Dateien kommen Zahlen in der Form +0013,71 oder -09,22 - also auch mit Komma.
    Einen Einfluß auf das angelieferte Format habe ich nicht. Meine Überlegung ist, dies zunächst temporär in VARCHAR einzulesen, und von da aus mit CAST / CONVERT zu behandeln. Gibt es bessere Alternativen?

    Danke schon einmal im voraus.

    Jörg


    • Bearbeitet Joerg_x Montag, 20. Februar 2012 18:13
    Montag, 20. Februar 2012 18:12

Antworten

  • Das kannst Du vorab mit

    EXECUTE master..xp_fileexist 't:\csbtest.csv'

    prüfen.

    HTH

    Henry

    • Als Antwort markiert Joerg_x Mittwoch, 22. Februar 2012 18:43
    Mittwoch, 22. Februar 2012 05:18

Alle Antworten

  • Hallo Jörg

    Joerg_x wrote:

    1. Ich bekomme mehrere Dateien geliefert, die ich mit bulk insert
    einlesen möchte. Allerdings kann bei den regelmäßigen Lieferungen eine
    (oder mehrere) dieser Dateien auch ausbleiben, wenn in der Periode keine
    Datensätze verarbeitet wurden. Nun möchte ich nicht, dass deshalb das
    Einlesen der weiteren Dateien mit einem Fehler abbricht, sondern der bulk
    insert für diese Datei(en) übersprungen wird. Wie wäre das möglich?

    Wie liest Du die Dateien ein? Per SSIS? Dort kannst Du einstellen, wieviele Fehler zu zulassen wisst und ob ein Fehler dazu führen soll, die Task abzubrechen.

    2. Innerhalb der Dateien kommen Zahlen in der Form +0013,71 oder -09,22 -
    also auch mit Komma.
    Einen Einfluß auf das angelieferte Format habe ich nicht. Meine
    Überlegung ist, dies zunächst temporär in VARCHAR einzulesen, und von da
    aus mit CAST / CONVERT zu behandeln. Gibt es bessere Alternativen?

    Wenn Du mit SSIS arbeitest könntest Du auch vorgängig die Files öffnen, normieren und dann unter einem anderen Namen abspeichern. Dabei könntest Du auch gleich die Files ausscheiden, die in 1 den Fehler verursachen.

    HTH
    Henry

    Dienstag, 21. Februar 2012 03:52
  • Hallo Henry

    das Einlesen erfolgt in dieser Form:

    BULK
    INSERT #CSVTest
    FROM 't:\csvtest.csv'
    WITH
    (
    FIELDTERMINATOR = ';',
    ROWTERMINATOR = '\n'
    )
    GO

    Ich dachte man könnte in vielleicht in dieser Form vorprüfen (habe aber nichts gefunden):

    IF EXISTS ('t:\csvtest.csv')
    BULK INSERT #CSVTest ...

    Hast Du noch eine Idee?

    Jörg

    Dienstag, 21. Februar 2012 20:14
  • Das kannst Du vorab mit

    EXECUTE master..xp_fileexist 't:\csbtest.csv'

    prüfen.

    HTH

    Henry

    • Als Antwort markiert Joerg_x Mittwoch, 22. Februar 2012 18:43
    Mittwoch, 22. Februar 2012 05:18
  • Hallo Henry,

    DECLARE @datei_vorhanden int  
     EXEC master..xp_fileexist 't:\csvtest.csv', @datei_vorhanden OUTPUT  
     IF @datei_vorhanden = 1  
        BULK INSERT #CSVTest
        FROM 't:\csvtest.csv'
        WITH
          (
           FIELDTERMINATOR = ';',
           ROWTERMINATOR = '\n'
          )
     ELSE  
     PRINT 'Datei existiert nicht.' 

    Wie cool finde ich das denn. Super.

    Und auch die anderen schönen Sachen, die man mit EXEC master..xp_fileexist hervorholen kann. Beeindruckend.

    Herzlichen Dank.

    Mittwoch, 22. Februar 2012 18:43