Announcement

Collapse
No announcement yet.

Export XML

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

  • Export XML

    Hallo zusammen!

    Bis jetzt ist mir immer wunderbar geholfen worden hier, daher die nächste Frage

    Nachdem, ich eine Lösung für das Importieren von XML Dateien bekommen habe: http://entwickler-forum.de/showthrea...t=62507&page=3, möchte ich nun welche exportieren.

    Hier mein Ansatz:
    Code:
    CREATE PROCEDURE WriteXML AS
    
    
    SELECT
    1 AS Tag,
    NULL AS Parent,
    'Id' AS [data!1!identifier],
    NULL AS [record!2!Id!element],
    NULL AS [record!2!name!element],
    NULL AS [record!2!adresse!element]
    
    UNION ALL
    
    SELECT
    2 AS Tag,
    1 AS Parent,
    'Id' AS [data!1!identifier],
    RecId AS [record!2!Id!element],
    NAME AS [record!2!NAME!element],
    ADRESSE AS [record!2!ADRESSE!element]
    
    FROM northwind..data_table
    where Id = 1
    
    FOR XML EXPLICIT
    Es wird damit zwar eine XML datei erstellt, aber es läuft noch nicht ganz rund und ich habe Schwierigkeiten mit dem Rausschreiben der Datei. Habe folgendes dazu gefunden:
    http://www.perfectxml.com/Articles/X...rtSQLXML.asp#4
    bzw. lautet der Befehl: bcp "EXEC Northwind..sproc_GetShippers" queryout c:\temp\bcpOut.xml -S. -Usa -P -c -r -t

    Was ist eigentlich dieses bcp? Ich habe mir zwar die Doku dazu angeguckt, aber das verstehe ich noch immer nicht ganz. Kann dieser Befehl in eine Stored Procedure eingebaut werden?

    Ich bekomme hier die Fehlermeldung: Incorrect syntax near 'queryout'. Obwohl ich die richtigen Angaben zu Procedur usw. eintrage. Wo liegt der Fehler?

    Vielen Dank im Voraus!
    Zuletzt editiert von w_ing; 06.07.2010, 08:57.

  • #2
    Beim bcp-Befehl muss der Dateiname auch eingetüttelt werden...

    bcp "EXEC Northwind..sproc_GetShippers" queryout "C:\temp\bcpOut.xml" -S. -Usa -P -c -r -t

    PS: SQL formatieren

    Comment


    • #3
      Vielen Dank für den Hinweis,

      leider habe ich immer noch denselben Fehler.

      Wie und wo soll bcp ausgeführt weden?

      Comment


      • #4
        bcp is ein Kommandozeilentool und daher per xp_cmdshell auszuführen. Hier ein Beispiel dazu, aus dem das vielleicht etwas besser ersichtlich ist.
        Wenn man BCP verwendet, sollte man auch über die Möglichkeiten Bescheid wissen, dazu ist das Durcharbeiten dieser Beschreibung unbedingt erforderlich. Damit sollte man das Problem lösen können

        bye,
        Helmut

        Comment


        • #5
          Hallo hwoess,

          Vielen Dank für den sehr hilfreichen Link.

          Irgendetwas klappt aber noch immer nicht. Hier mein Ansatz:
          Mit dieser Procedur soll soll eine XML Datei erstellt werden:

          Code:
          CREATE PROCEDURE WriteXML AS
          
          
          SELECT
          1 AS Tag,
          NULL AS Parent,
          'Id' AS [data!1!identifier],
          NULL AS [record!2!Id!element],
          NULL AS [record!2!name!element],
          NULL AS [record!2!adresse!element]
          
          UNION ALL
          
          SELECT
          2 AS Tag,
          1 AS Parent,
          'Id' AS [data!1!identifier],
          RecId AS [record!2!Id!element],
          NAME AS [record!2!NAME!element],
          ADRESSE AS [record!2!ADRESSE!element]
          
          FROM northwind..data_table
          where Id = 1
          
          FOR XML EXPLICIT
          Anschließend rufe ich diese mit einer anderen auf:

          Code:
          CREATE PROCEDURE ExportXML AS
          
          DECLARE @FileName varchar(50),
          @bcpCommand varchar(2000)
          
          SET @FileName = REPLACE('\\server\tmp\XML_ordner\testen.xml','/','-')
          
          SET @bcpCommand = 'bcp "SELECT * FROM northwind.dbo.WriteXML" queryout "'
          SET @bcpCommand = @bcpCommand + @FileName + '" -c -t; -r\n'
          
          EXEC master..xp_cmdshell @bcpCommand
          Wenn ich die Befehle so aufrufe, passiert auch etwas. Aber es wird keine Datei erstellt. Hier die (original) Meldung, die ich bekomme:

          Password:
          SQLState = 08001, NativeError = 14
          Error = [Microsoft][ODBC SQL Server Driver][Shared Memory]Invalid connection.
          SQLState = 01000, NativeError = 14
          Warning = [Microsoft][ODBC SQL Server Driver][Shared Memory]ConnectionOpen (Invalid Instance()).
          NULL

          Was fehlt da noch?
          Zuletzt editiert von w_ing; 06.07.2010, 08:57.

          Comment


          • #6
            Nebenbei eine weitere Frage:

            Bis jetzt erstelle ich mit dieser Procedur eine XML Datei, die nur 2 Ebenen hat. Wie komme ich da weiter?
            In dem Beispiel hier: http://www.ianywhere.com/developer/p...9/00000535.htm
            Siehe [dept!3!name!element]
            Kann auch mit TagNumber 3 gearbeitet. Bei mir bleibt dieser Befehl ohne Beachtung. Wieso?

            Comment


            • #7
              Du kannst kein "SELECT * FROM northwind.dbo.WriteXML" machen, da WriteXML ein stored proc und keine Tabelle ist. Aber weil es in dieser Form ein resultset liefert, einfach mal nur "exec northwind.dbo.WriteXML" schreiben

              Der SharedMemory-Fehler ist eine zweite Sache. Was mir auf die Schnelle dazu einfällt:
              - TCPIP nicht enabled
              - kann nicht direkt auf einen anderen Rechner schreiben (probiere doch mal auf das lokale C-Laufwerk zu schreiben)
              - das Konto unter dem das xp_cmdshell ausgeführt wird hat keine Schreibrechte auf dem anderen Rechner

              bye,
              Helmut

              Comment


              • #8
                Hallo Helmut,

                Habe das mit dem "exec northwind.dbo.WriteXML" ausprobiert. Immer noch dieselbe Meldung.

                Beim Versuch auf die eigene Festplatte zu schreiben, ebenfalls.

                Sieht das Vorgehen denn sonst richtig aus?

                Die XML Datei alleine wird auf jeden Fall erzeugt und in der temporären Tabelle angezeigt...


                Vielen Dank für deine Mühe!
                Grüße
                Alex

                Comment


                • #9
                  ... morgen wieder, jetzt ist Fussball

                  bye,
                  Helmut

                  Comment


                  • #10
                    Alles klar!

                    Dann viel Spaß beim Fussball! Hoffentlich erwische ich noch die zweite Hälfte

                    Comment


                    • #11
                      Die zweite Halbzeit hat sich gestern ja noch richtig gelohnt!

                      Zurück zu meinen Problemen

                      Hier meine aktuelle Procedure:
                      Code:
                      DECLARE @FileName varchar (255)
                        ,@cmd varchar (2000); 
                      
                      SET @FileName = REPLACE ('\\server_01\xml_ordner\testen.xml' ,'/' ,'-'); 
                      
                      SET @cmd = 'bcp "EXEC mydatabase.dbo.WriteXML NULL" queryout "'
                      
                      SET @cmd = @cmd + @FileName + '" -c -t; -r\n -T -S' + (SELECT @@Servername)
                      
                      EXEC master..xp_cmdshell @cmd;
                      Die Fehlermeldungen werden weniger:

                      SQLState = 28000, NativeError = 18456
                      Error = [Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'NT-AUTORITÄT\SYSTEM'.
                      NULL

                      Comment


                      • #12
                        Hallo!

                        Habe noch etwas anderes ausprobiert. Stoße aber auch hier auf Fehlermeldungen:

                        Code:
                        declare @str varchar(8000)
                        select @str = 'isql -Q"EXEC mydatabase.dbo.WriteXML" -E -o\\server_01\xml_ordner\testen.xml'
                        exec master..xp_cmdshell @str
                        Nach 10 Sek. Denkzeit wird im richtigen Verzeichnis eine XML Datei erstellt, jedoch ist diese leer bzw. folgendes steht drin:

                        DB-Library: Unable to connect: SQL Server is unavailable or does not exist. Invalid connection.
                        Net-Library error 14: ConnectionOpen (Invalid Instance()).

                        Was läuft falsch? Versuche nun doch mal die zu erstellende XML Datei in einer Tabelle abzulegen und diese anschließend rauszukopieren...

                        Comment


                        • #13
                          Sieht mir jetzt mal danach aus, als würde der SQL-Server nicht gefunden - daher auch diese 10 Sekunden, da wird nach einem Server gesucht. Nachdem ich aber weder deine Installation noch den Rest der Rechnerumgebung und deren Einstellungen kenne, ist es schwer, hierzu etwas zu sagen. Probiere das isql doch mal in einem Command-Fenster am Server aus, also Start -> ausführen -> cmd eingeben und <Enter>, im Fenster dann "isql -E" und <Enter> ... was passiert dann?

                          bye,
                          Helmut

                          PS: die beiden Tore in der ersten Halbzeit waren aber auch absolut sehenswert

                          Comment


                          • #14
                            Hallo Helmut,

                            vielen Dank für eine so ausführliche Beschreibung. Leider passiert da nichts.
                            Vielleicht weil das Ganze Zeug ja auf einem Server liegt? Der Server mit dem Namen serv01 kann von mir angepingt werden und meldet sich auch...

                            Wie kann ich den Servernamen mit in den Befehl einbinden?

                            PS.: Ich hoffe, ich verpasse das Spiel heute nicht

                            Comment


                            • #15
                              Hallo Helmut, ich habe mich nun lange mit der Doku dazu auseinandersetzt und habe den Befehl ausführen können. Noch kann ich allerdings nur auf meiner lokalen Festplatte speichern. Mal sehen, wie ich das auf den Serverrechner verlege...

                              PS: Wünsche heute abend viel Spaß beim Spiel! Als Trost für dich, meiner Meinung nach hätte Österreich schon mehr verdient bei dieser WM dabei zu sein als z.B. Frankreich

                              Comment

                              Working...
                              X