Announcement

Collapse
No announcement yet.

Datei erstellen aus einem Trigger

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datei erstellen aus einem Trigger

    Hallo zusammen,

    hab folgendes Problem.
    ich soll eine Datei mit Beleginformationen erzeugen, die von einem anderen Programm alle ca. 15 min umbenannt und verarbeitet wird.

    Meine Überlegungen:
    ich erstell über einen Trigger der Belegtabelle eine Textdatei und fülle
    sie mit den Daten.

    Problem:
    1.) Kann ich eine Text-datei aus einem Trigger heraus erstellen?
    2.) kann ich in SQL die Existenz der Datei überprüfen?

    Danke Euch schon mal prophylaktisch.

    joe.

  • #2
    Hallo,

    zu Frage 1: Ja<br>
    zu Frage 2: Ja

    Über die Systemprozedur <b>xp_cmdshell</b> kann eine externe Anwendung bzw. eine Betriebssystemfunktion aufgerufen werden:
    <pre>
    exec master.dbo.xp_cmdshell 'dir C:\Temp\GesuchteDatei.txt'
    </pre>

    Um zu prüfen, ob eine Datei auf der Festplatte vorhanden ist, kann man folgendes machen: Wenn der Name der zu suchenden Datei als Parameter übergeben werden soll, muss die Anweisung dynamisch zusammengebaut werden. Nachdem alle Rückgabedaten von <b>xp_cmdshell</b> (also der Output der DIR-Anweisung) in die temp. Tabelle eingefügt wurden, kann nach dem Vorkommen der Zeichenkette 'Bytes' gesucht werden. Am Ende wird die temp. Tabelle wieder gelöscht, damit ein nochmaliger Aufruf der Stored Procedure während der eigenen Session die temp. Hilfstabelle neu anlegen kann.
    <pre>
    CREATE PROCEDURE DoesFileExists
    @sFileName VARCHAR(100)
    AS
    DECLARE @sDirCmd VARCHAR(150)
    -- auszuführende Anweisung dynamisch zusammenbauen
    SET @sDirCmd = 'dir ' + @sFileName
    -- temp. Hilfstabelle erzeugen
    CREATE TABLE #DirResults (
    DirOutput VARCHAR(500))
    -- Output von xp_cmdshell in die Hilfstabelle einfügen
    INSERT #DirResults
    EXEC master.dbo.xp_cmdshell @sDirCmd
    -- Datei vorgefunden ?; temp. Hilfstabelle löschen
    IF EXISTS (SELECT * FROM #DirResults WHERE DirOutput LIKE '%Bytes%')
    BEGIN
    DROP TABLE #DirResults
    Return (0)
    END
    ELSE
    BEGIN
    DROP TABLE #DirResults
    Return (-1)
    END
    </pre>
    In einer zweiten Stored Procedure, in einer Stapelanweisung oder einem Trigger kann nun die eigene Prozedur aufgerufen werden, wobei der Parameter die zu suchende Datei definiert. Anschließend wird der Rückgabewert ausgewertet:
    <pre>
    DECLARE @iResult INT
    DECLARE @sMsgTxt VARCHAR(30)
    EXEC @iResult = DoesFileExists 'C:\TEMP\IN14.zip'
    IF @iResult = 0
    SET @sMsgTxt = 'Datei ist vorhanden'
    ELSE
    SET @sMsgTxt = 'Datei ist nicht vorhanden'
    SELECT @sMsgTxt
    </pre&gt

    Comment


    • #3
      Danke Herr Kosch,

      "xp_cmdshell" war das Zauberwort, das mir fehlte.
      Mal wieder eine genial einfache Lösung von Ihnen.

      jo

      Comment

      Working...
      X