Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQLCMD - Alle XML Dateien in einem Verzeichnis in Tabelle

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von flipmode85, 14 Mai 2017.

  1. flipmode85

    flipmode85 Benutzer

    Hallo,

    ich heiße Jürgen, bin 32 Jahre alt. Hauptsächlich beschäftige ich mich mit der Webprogrammierung in PHP/HTML/Java. Aktuell benötige ich für mich selbst ein kleines script, welches es mir ermöglicht XML-Dateien in eine MSSQL Tabelle zu schreiben.

    Konkret geht es um eine Warenwirtschaftssoftware in welche ich "Aufträge" importieren möchte.
    Die Software selbst nutzt einen sogenannten "Worker" welcher eine Tabelle in den Datenbank überwacht und neue Einträge abarbeitet - so zumindest für mein Verständnis.

    In den letzten Tagen habe ich ein PHP Script geschrieben welches von einer API die Bestelldaten abholt und in das für die Software korrekt formatierte XML-Format schreibt. Mittels CMD Batch hole ich jede einzelne Bestellung als *.xml file via FTP auf einen lokalen Rechner. Lt. Aussage des Softwareherstellers der WaWi kann immer nur eine einzelne Bestellung welche in die Tabelle in der Datenbank abgelegt wird importiert werden, zuvor hatte ich nämlich alle Bestellungen in eine XML Datei gepackt.

    Besteht eine Möglichkeit, jede XML-Datei in einem Verzeichnis schrittweise in die Tabelle zu schreiben um so den Import zu vollziehen? Leider hab ich mit MSSQL , zumindest via CMD noch sehr wenig Erfahrung.
    Google brachte mich zumindest teilweise ans Ziel und zwar in dieses Forum :)

    Auf dem Rechner läuft MS SQL Server 2008 R2.

    Grüße,

    Jürgen
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Über alle Dateien in einem Verzeichniss zu iterieren und jeweils damit etwas auszuführen ist eher eine Anfängeraufgabe und nicht Thema in diesem Forum hier.

    Code:
    for i in $(seq 1 10); do touch file$i.xml; done;
    for f in *.xml; do echo "verarbeite $f"; done
    verarbeite file10.xml
    verarbeite file1.xml
    verarbeite file2.xml
    verarbeite file3.xml
    verarbeite file4.xml
    verarbeite file5.xml
    verarbeite file6.xml
    verarbeite file7.xml
    verarbeite file8.xml
    verarbeite file9.xml
    
    Sollte für andere Shell-Umgebungen sicherlich ähnlich gehen, vielleicht sogar für Windows.
     
  3. Dukel

    Dukel Datenbank-Guru

    Da sollten sich doch die SQL Server Integration Services anbieten. Damit sollten sich die Daten auch per FTP holen lassen.
     
  4. flipmode85

    flipmode85 Benutzer

    Guten Morgen!

    das tut mir leid, ich wusste nicht das hier Anfängerfragen nicht erwünscht sind.
    Vielen Dank für das Beispiel, das hilft mir zumindest schon teilweise weiter.

    Ich hänge derzeit eher am sqlcmd Befehl, weil ich nichts finden kann, wie ich ein xml-File via insert übergeben kann.

    Im Software-Wiki ist lediglich folgendes Beispiel hinterlegt.

    Code:
    insert [ebstore].[dbo].[tXML]
    (cText, nForm, nBilling) values( '
    <?xml version="1.0" encoding="iso-8859-1"?>
    <order>.........................</order>
    ',5,0);
    

    Tatsächlich? Das holen der Daten via FTP habe ich derzeit via .bat erledigt, welche stündlich durch den Windows-Aufgabenplaner aufgerufen wird. Klappt soweit ganz gut. Das werde ich mir dann nochmal ansehen müssen.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Du hast offensichtlich den Satz nur halb gelesen - und damit nur halb verstanden.
     
  6. ukulele

    ukulele Datenbank-Guru

    Also den Dateinamen zu ermitteln und den Import anzustoßen ginge auch in SQL aber ich denke das kannst du bereits mit cmd bewerkstelligen.

    Den Import würde ich aus SQL heraus machen, wobei auch dieser SQL Befehl per CMD angestoßen werden kann. Ob es eine andere Möglichkeit gibt weiß ich nicht aber probier mal mit:
    Code:
    INSERT INTO files([pk],[data])
    SELECT   newid() AS pk,
         convert(XML,x.BulkColumn,2) AS data
    FROM   OPENROWSET(BULK 'd:\folder\file.xml',SINGLE_BLOB) AS x;
    data ist in diesem Fall eine XML Spalte, natürlich kann man noch den Dateinamen, Pfad oder sonstwas mit einfügen. Außerdem kann es sein das der Befehl fehl schlägt wenn es sich nicht um gültiges XML handelt.
     
    flipmode85 gefällt das.
  7. flipmode85

    flipmode85 Benutzer

    ... mir qualmt der Kopf. Nach mehreren Stunden erfolglosen Herumprobieren gebe ich mich wohl geschlagen.
    Es liegt wohl an den restlichen "values" welche mir fehlen.

    Code:
    (cText, nForm, nBilling) values( 'xml-file',nForm,nBilling);
    

    Sprich die 5 für nForm und die 0 für nBilling. Fehlen diese Werte, wird der "Worker" nicht aktiv und importiert die Bestellung nicht.
     
  8. Dukel

    Dukel Datenbank-Guru

    Hast du dir jetzt einmal die Integration Services angeschaut? Diese haben genau den Zweck. Daten in den SQL Server zu laden.
     
  9. flipmode85

    flipmode85 Benutzer

    Leider hab ich wohl nur eine Standardversion von SQL Server 2016 installiert und so keinen Zugriff auf die Microsoft Integration Services.
     
  10. ukulele

    ukulele Datenbank-Guru

    Wenn du erstmal nur im SQL Management Studio
    Code:
    SELECT convert(XML,x.BulkColumn,2) AS data
    FROM OPENROWSET(BULK 'd:\folder\file.xml',SINGLE_BLOB) AS x;
    aufrufst, kommen dann Daten oder ein Fehler?
     
  11. flipmode85

    flipmode85 Benutzer

    Guten Morgen,

    das lässt sich mit erfolg ausführen!
     
  12. ukulele

    ukulele Datenbank-Guru

    Dann solltest du den Inhalt auch in eine Tabelle und entsprechend eine Spalte mit XML als Datentyp schreiben können. Auch per Batch sofern die Berechtigungen passen.

    Falls du die XML Daten auswerten willst würde ich das erst in einem zweiten Schritt tun.
     
  13. flipmode85

    flipmode85 Benutzer

    Ich denke da liegt auch das Problem, die Übergabe in die korrekte Spalte.
     
  14. ukulele

    ukulele Datenbank-Guru

    Naja du hast
    Code:
    INSER INTO tabelle(spalte1,spalte2,spalte_xml,spalte_n)
    SELECT irgendwas,irgendwas,convert(XML,x.BulkColumn,2),irgendwas
    FROM OPENROWSET(BULK 'd:\folder\file.xml',SINGLE_BLOB) AS x;
    das soll wohl laufen wenn die Spalte XML als Format hat, sonst würde ja vorher das convert(XML,) schon scheitern.
     
  15. flipmode85

    flipmode85 Benutzer

    Wenn ich folgendes ausführen möchte..

    Code:
    INSERT INTO [eazybusiness].[dbo].[tXMLBestellImport](cText, nPlattform, nRechnung)
    SELECT convert (XML,x.BulkColumn,2), 5, 0
    FROM OPENROWSET (BULK 'c:\XML\dawanda_order.xml', SINGLE_BLOB) AS x
    
    erhalte ich folgenden Fehler:

    Meldung 257, Ebene 16, Status 3, Zeile 1
    Die implizite Konvertierung vom xml-Datentyp in varchar(max) ist nicht zulässig. Verwenden Sie die CONVERT-Funktion, um diese Abfrage auszuführen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden