SQLCMD - Alle XML Dateien in einem Verzeichnis in Tabelle

flipmode85

Benutzer
Beiträge
9
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
 
Werbung:
Besteht eine Möglichkeit, jede XML-Datei in einem Verzeichnis schrittweise in die Tabelle zu schreiben um so den Import zu vollziehen?

Ü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.
 
Da sollten sich doch die SQL Server Integration Services anbieten. Damit sollten sich die Daten auch per FTP holen lassen.
 
Guten Morgen!

Ü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.

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);


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

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.
 
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.
 
... 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.
 
Hast du dir jetzt einmal die Integration Services angeschaut? Diese haben genau den Zweck. Daten in den SQL Server zu laden.
Microsoft Integration Services ist eine Plattform zum Erstellen von Datenintegrations- und Datentransformationslösungen auf Unternehmensebene. Sie verwenden Integration Services, um komplexe Unternehmensprobleme durch Kopieren oder Herunterladen von Dateien, Senden von E-Mail-Nachrichten als Antwort auf Ereignisse, Aktualisieren von Data Warehouses, Bereinigen von Daten und Data Mining sowie Verwalten von SQL Server-Objekten und -Daten zu lösen. Die Pakete können alleine oder zusammen mit anderen Paketen verwendet werden, um komplexe geschäftliche Anforderungen zu erfüllen. Integration Services kann Daten aus einer Vielzahl von Quellen, z. B. XML-Datendateien, Flatfiles und relationale Datenquellen, extrahieren und transformieren und die Daten dann in ein oder mehrere Ziele laden.
 
Leider hab ich wohl nur eine Standardversion von SQL Server 2016 installiert und so keinen Zugriff auf die Microsoft Integration Services.
 
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?
 
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.
 
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.
 
Werbung:
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.
 
Zurück
Oben