Announcement

Collapse
No announcement yet.

XML 2 MS SQL Server 2000

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

  • XML 2 MS SQL Server 2000

    Hallo zusammen!

    Ich bin ein totaler Anfänger in Arbeit mit dem SQL Server, bitte daher im Voraus, mir eventuelle Versprecher zu entschuldigen...

    Ich habe folgendes Problem: Eine XML Datei muss in meinen MS SQL 2000 Server eingelesen werden.

    So hat die Funktion für eine Oracle Datenbank ausgesehen:

    Code:
    insert into XML_Table (spalte1, spalte2, File_Name, XML_File)
                     values (value1, value2, sFilename,
                             XMLType (bfilename (DIR_Verzeichnis, sFilename), nls_charset_id ('AL32UTF8')));
    Was da gemacht wird: Eine XML Datei wird aus dem directory "DIR_Verzeichnis" in die Tabelle XML_Table eingelesen.

    Wie würde ein entsprechendes Befehl in SQL für den MS SQL 2000 lauten?

    Vielen Dank im Voraus für eure Mühe!

    Grüße
    Alex

  • #2
    AFAIK geht das nicht mit der 2000er Version. Du mußt dir schon die 2005er Version besorgen. Diese unterstützt XML als Datentyp.

    Comment


    • #3
      Auch hallo,

      das Unterforum für SQL Server findet sich hier. Aber vielleicht hilft eine Suchmaschine des Vertrauens mit den Stichwörtern "+xml +file +"sql server 2000" site:microsoft.com" hier weiter, z.B. mit http://support.microsoft.com/kb/316005
      MfG
      Cheat-Sheets for Developers / Programming Quotes

      Comment


      • #4
        danke

        Hallo!

        Vielen Dank schon mal soweit. Sorry, dass ich mich im Forum vertan habe. Den angegebenen Link habe ich bereits auch, vielen Dank! Bin aber halt noch unsicher...

        Es muss leider MS SQL 2000 bleiben, das suche ich mir nicht aus :-(

        Danke noch einmal! Für weitere Ideen wäre ich sehr verbunden!

        Comment


        • #5
          Es ist nicht 1:1 umsetzbar das die 200er Version keinen XML-Datentyp kann. Du kannst die XML-Datei damit nur als Textdatei in ein DB-Feld speichern). Möglichkeiten mittels SQL-XML-Syntax auf Element in der Spalte zuzugreifen hast du hier noch nicht.

          Comment


          • #6
            Vielen Dank für diese Antwort!

            Habe folgende Fragen dazu:

            1.) Wie kann eine XML Datei in Form eines Textes eingelesen werden?
            2.) Wie bearbeite ich diese anschließend am besten? Ich muss den Inhalt bestimmter Knoten in entsprechende Tabellen packen.

            Ich lese gerade die Doku und Beispiele dazu, habe aber trotzdem Schwierigkeiten mit der Umsetzung.

            Danke!

            Comment


            • #7
              Hallo,

              in welcher Sprache soll das Ganze erfolgen - in 'reinem' T-SQL oder gibt es eine Applikation z.B. mit der Möglichkeit ein Framework einzubinden?
              Ich habs gleich!
              ... sagte der Programmierer.

              Comment


              • #8
                Hallo,

                ich denke, es müsste schon das reine T-SQL sein. Solltest du ein konkretes Beispiel haben, kann ich das schnell ausprobieren...

                Folgedne Links habe ich bis jetzt gefunden. Mit dem Verständnis bzw. mit der Umsetzung habe ich trotzdem meine Schwierigkeiten:

                http://articles.techrepublic.com.com...1-5796532.html
                http://www.codeproject.com/KB/database/openxml.aspx

                Comment


                • #9
                  Habe noch eine weitere mögliche Lösung gefunden: http://www.experts-exchange.com/Micr..._23194722.html

                  Ich verstehe allerdings nicht wirklich, was da gemacht wird und habe daher Schwierigkeiten, das an mein Problem anzupassen...

                  Comment


                  • #10
                    Ich glaube, speziell mit dieser Lösung hier müsste es gehen...

                    Brauche noch ein paar Hilfestellungen.

                    xml datei
                    Code:
                    <?xml version="1.0"?>
                      <Order>
                    <CustomerID>ALFKI</CustomerID>
                    <EmployeeID>3</EmployeeID>
                    <OrderDate>07/3/2004</OrderDate>
                    <RequiredDate>07/4/2004</RequiredDate>
                    <ShippedDate>15/3/2004</ShippedDate>
                       
                    <OrderDetails ProductID="2" UnitPrice="15"
                       Quantity="5" Discount="0.15"></OrderDetails>
                       
                    <OrderDetails ProductID="4" UnitPrice="22"
                       Quantity="7" Discount="0.21"></OrderDetails>
                       
                    <OrderDetails ProductID="10" UnitPrice="31"
                       Quantity="3" Discount="0.15"></OrderDetails>
                    </Order>
                    An welcher Stelle wird die eigentliche Datei eingelesen? Wird/kann diese gespeichert werden?

                    Code:
                    CREATE PROCEDURE xmlOrderInsert @order ntext AS
                    DECLARE @docHandle int, @OID int
                    EXEC sp_xml_preparedocument @docHandle OUTPUT, @order
                    BEGIN TRANSACTION
                    INSERT INTO Orders( CustomerID, EmployeeID, OrderDate, RequiredDate ) 
                      SELECT CustomerID, EmployeeID, OrderDate, RequiredDate 
                      FROM Openxml( @docHandle, '/Order', 3) WITH ( CustomerID nchar(5), 
                      EmployeeID int,   OrderDate datetime, RequiredDate datetime   )
                    IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -100 END
                    SET @OID = SCOPE_IDENTITY()
                    INSERT INTO [Order Details] ( OrderID, ProductID, UnitPrice, Quantity, Discount ) 
                    SELECT @OID AS [PO ID], ProductID, UnitPrice, Quantity, Discount 
                     FROM OpenXml( @docHandle, '/Order/OrderDetails', 1)   WITH 
                      ( ProductID int, UnitPrice money, Quantity smallint, Discount real   ) 
                      IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN -101 END
                    COMMIT TRANSACTION
                    EXEC sp_xml_removedocument @docHandle SELECT @OID AS [Order ID]
                    GO
                    Vielen Dank im Voraus für eure Mühe!

                    Comment


                    • #11
                      In der von dir gezeigten Prozedur gibt es kein Einlesen der Datei, das muss schon vorher erfolgen, da der Inhalt dann als Parameter @order an die Prozedur übergeben wird. Eine Möglichkeit, wie man eine Textdatei einlesen kann, siehe hier. SQL2000 kennt noch kein varchar(max) daher dort mal ntext (bzw. text) als Variablentyp probieren.

                      bye,
                      Helmut

                      Comment


                      • #12
                        Danke für diese Antwort!

                        Ich habe eine Tabelle xml_table mit der Spalte xml_file.

                        Wenn ich folgendes mache:
                        INSERT INTO #xml_table(xml_file)
                        SELECT * FROM OPENROWSET(
                        BULK 'd:\Ordner\testfile.txt',
                        SINGLE_BLOB) AS x

                        Bekomme ich allerdings einen Fehler: "Incorrect syntax near the keyword 'BULK'."

                        Von welchem Typ müsste die Spalte xml_file sein? Wie man mir hier bereits erklärt hat, können bei sql 2000 keine XML Dateien gespeichert werden. Was wäre eine Alternative?

                        Könnte bitte jemand eine (mehr oder weniger) komplette Lösung für mein Problem Liefern?

                        Was ich letztendlich erreichen möchte, ist die Inhalte der XML Datei in entsprechende Tabellenspalten zu speichern. Ein kleiner kompletter Ansatz, den ich übertragen könnte, wäre eine unglaubliche Hilfe für mich!

                        Vielen Dank im Voraus!

                        Comment


                        • #13
                          Hallo!

                          Mein zwischenstand sieht so aus:
                          Code:
                          declare 
                          @myDoc varchar(1000),
                          @docHandle int
                          
                          set @myDoc = '<Order>
                          <CustomerID>ALFKI</CustomerID>
                          <EmployeeID>3</EmployeeID>
                          <OrderDate>07/3/2004</OrderDate>
                          <RequiredDate>07/4/2004</RequiredDate>
                          <ShippedDate>15/3/2004</ShippedDate>
                             
                          <OrderDetails ProductID="2" UnitPrice="15"
                             Quantity="5" Discount="0.15"></OrderDetails>
                             
                          <OrderDetails ProductID="4" UnitPrice="22"
                             Quantity="7" Discount="0.21"></OrderDetails>
                             
                          <OrderDetails ProductID="10" UnitPrice="31"
                             Quantity="3" Discount="0.15"></OrderDetails>
                          </Order>'
                          
                          exec sp_xml_preparedocument @docHandle output, @myDoc
                          
                          Begin transaction
                          
                          insert into xml_table(xml_file)
                          select text 
                          from openxml(  @docHandle, '/Order/CustomerID', 2)
                          where (localname =  '#text')
                          
                          Commit transaction
                          
                          Go
                          xml_file ist dabei vom type ntext.

                          Bitte sagt mir, ob ich alles wieder zu umständlich mache?
                          Wie kann ich jetzt die Datei von der Festplatte automatisch einlesen anstatt diese explizit der Variable @myDoc zuzuweisen? Habe es bis jetzt nicht hinbekommen, trotz Hinweise hier

                          Vielen Dank!

                          Comment


                          • #14
                            Sorry, habe nicht aufgepasst - das BULK gibt es erst ab Server 2005
                            Aber vielleicht hilft das weiter (habe selber keinen Server 2000 mehr zum ausprobieren)...
                            Link 1
                            Link 2

                            bye,
                            Helmut

                            Comment


                            • #15
                              Hallo! Vielen Dank!

                              Folgende habe ich zusätzlich gefunden:

                              Code:
                              DECLARE @FileName varchar(255)
                              DECLARE @ExecCmd VARCHAR(255)
                              DECLARE @y INT
                              DECLARE @x INT
                              DECLARE @FileContents VARCHAR(8000)
                              
                              CREATE TABLE #tempXML(PK INT NOT NULL IDENTITY(1,1), ThisLine VARCHAR(255))
                              
                              SET @FileName = 'C:\Temp\CurrentSettings.xml'
                              SET @ExecCmd = 'type ' + @FileName
                              SET @FileContents = ''
                              
                              INSERT INTO #tempXML EXEC master.dbo.xp_cmdshell @ExecCmd
                              SELECT @y = count(*) from #tempXML
                              
                              SET @x = 0
                              WHILE @x <> @y
                                  BEGIN
                                      SET @x = @x + 1
                                      SELECT @FileContents = @FileContents + ThisLine from #tempXML WHERE PK
                               = @x
                                  END
                              
                              SELECT @FileContents as FileContents
                              DROP TABLE #tempXML
                              Ich schaffe es aber noch immer nicht, wirklich eine Datei von der Festplatte zu lesen...

                              Könnte mir bitte jemand aufzeigen, wie ich einen XML Text als Text einer Variable zuweisen?

                              Danke!!!

                              Comment

                              Working...
                              X