Announcement

Collapse
No announcement yet.

XML-Datei mit Schema importieren

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

  • XML-Datei mit Schema importieren

    Hallo,

    ich möchte eine (mehrere) xml-Dateie(n) in ein Tabelle importieren. Leider weiß ich nicht wie und finde auch im www nichts . Bitte um Hilfe (exemplarische Vorgehensweise).

    Dazu ein Beispiel:

    Die xml-Datei ist unter D:\Kunden.xml und sieht so aus:
    Code:
    <?xml version="1.0" encoding="utf-8"?>
    <Kunden>
    	<Kunde>
    		<ID>1</ID>
    		<Nachname>Mustermann1</Nachname>
    		<Vorname>Max1</Vorname>
    		<Email>[email protected]</Email>
    	</Kunde>
    	<Kunde>
    		<ID>2</ID>
    		<Nachname>Mustermann2</Nachname>
    		<Vorname>Max2</Vorname>
    		<Email>[email protected]</Email>
    	</Kunde>
    </Kunden>
    Es sind dabei hunderte oder mehr Kunden vorhanden.

    Die Tabelle in welche die Daten eingefügt werden soll sieht so aus:
    Code:
    CREATE TABLE tblKunden
    (
    	ID       int IDENTITY PRIMARY KEY,
    	Nachname nvarchar(100),
    	Vorname  nvarchar(100),
    	Email    nvarchar(100)
    )
    Wie kann ich die xml-Datei (von der Festplatte) - mit Hilfe eines Schemas (oder auch nicht) in die Tabelle importieren?

    Gibt es eine Möglichkeit ein Schema zu definieren in dem das xml-Element der Tabellenspalte zugewiesen werden kann?

    Vielen Dank im Voraus!
    Zuletzt editiert von gfoidl; 29.03.2008, 23:17.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

  • #2
    Hallo,

    Ich hab es zwar selber noch nie probiert, aber dieser Artikel scheint sich ua auch mit diesem Thema zu beschaeftigen. Beim 'Ueberfliegen' des Artikels ist mir dieser Command aufgefallen, der dir vielleicht weiterhelfen koennte:

    INSERT INTO Answers
    SELECT *
    FROM OPENXML (@hDoc,'/insert/Answers')
    WITH (EvalID int,
    Qnum int,
    Answer varchar(20))


    http://www.sql-server-performance.co..._calls_p1.aspx

    Hoffe das hilft dir weiter
    *-- robert.oh. --*

    Comment


    • #3
      Ich weiß jetzt wies geht. Anbei das SQL-Skript:

      Code:
      --*****************************************************************************
      -- Version:         1.0.0
      -- Erstellt am:     30.03.2008 (Ver. 1.0.0)
      -- Autor:           Günther M. FOIDL
      -------------------------------------------------------------------------------
      
      -- Katalog wählen:
      USE Test;
      GO
      
      -- Falls Tabelle vorhanden -> diese löschen:
      IF  EXISTS (SELECT *
                  FROM sys.objects
                  WHERE object_id = OBJECT_ID(N'[dbo].[tblKunden]')
                  AND type in (N'U'))
      DROP TABLE tblKunden;
      
      -- Tabelle erstellen:
      CREATE TABLE tblKunden
      (
          ID       int IDENTITY PRIMARY KEY,
          Nachname nvarchar(100),
          Vorname  nvarchar(100),
          Email    nvarchar(100)
      )
      
      -------------------------------------------------------------------------------
      -- Die XML-Datei wird in ein temporäre Tabelle eingelesen. Ein Einlesen in eine
      -- Variable funktioniert aufgrund der dynamischen SQL-Anweisung nicht (neuer
      -- Stapel -> Gültigkeit von Variablen!). Dynamisches SQL wird verwendet da
      -- sonst keine Variable für den Dateinamen verwendet kann.
      
      -- temporäre Tabelle erstellen:
      CREATE TABLE #tmpXML
      (
          xmlData xml
      );
      
      DECLARE @xmlFile nvarchar(100);     -- XML-Datei
      SET     @xmlFile = 'D:\Kunden.xml';
      
      -- XML-Daten in die temp. Tabelle laden:
      EXEC('
      INSERT INTO #tmpXML
      SELECT *
      FROM OPENROWSET (BULK ''' + @xmlFile + ''', SINGLE_BLOB) AS xmlData
      ')
      
      -- Die Daten aus der Tabelle in einer Variablen speichern, damit OPENXML
      -- darauf zugreifen kann:
      DECLARE @doc xml;
      SELECT @doc = xmlData FROM #tmpXML
      DROP TABLE #tmpXML                  -- temp. Tabelle wird nicht mehr benötigt
      
      -- XML in DOM überführen (Vorbereitung für OPENXML)
      DECLARE @idoc int;
      EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
      
      -- Daten einfügen (mit OPENXML):
      INSERT INTO tblKunden (Nachname, Vorname, Email)
      SELECT Nachname, Vorname, Email
      FROM
      OPENXML (@idoc, '/Kunden/Kunde', 2)
      WITH
      (
          Nachname nvarchar(100) './Nachname',
          Vorname  nvarchar(100) './Vorname',
          Email    nvarchar(100) './Email'
      )
      
      -- Handle wieder freigeben:
      EXEC sp_xml_removedocument @idoc
      
      --*****************************************************************************
      -- Kontrollausgabe:
      SELECT * FROM tblKunden;
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment

      Working...
      X