Announcement

Collapse
No announcement yet.

XML in SQL Server Management einlesen

Collapse
This topic is closed.
X
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #31
    Ergebnis

    Code:
     
    leader controlfield datafield subfield datafield subfield datafield subfield
    00000nz a2200000nc 4500 1011387409 24 http://d-nb.info/gnd/7744007-9 35 (DE-101)1011387409 35 (DE-588)7744007-9

    Comment


    • #32
      sorry, irgendwie kriege ich die Tabelle nicht gut hin hier:
      leader controlfield datafield subfield datafield subfield datafield subfield
      00000nz a2200000nc 4500 1011387409 24 http://d-nb.info/gnd/7744007-9 35 (DE-101)1011387409 35 (DE-588)7744007-9

      Comment


      • #33
        Im Enddefekt bekomme ich das Ergebnis, was ich brauche für die erste Datafields. Aber ich möchte where Klause einbauen, wo steht auch gib mir datafield wo tag=440, das bedeutet ich kann nicht arbeiten mit
        datafield[2]/@tag, weil es kann sein, dass datafield 440 ist nicht [2], aber [3], oder so.
        Kann mir jemand helfen, wie ich das einbauen kann, bitte.

        Vielen Dank im Voraus!
        Zuletzt editiert von Anna85; 09.05.2019, 16:42.

        Comment


        • #34
          Versuch doch mal den Ansatz, den ich vorgeschlagen habe, volles Select der XML Daten, den Rest in einem äußeren Select abwicklen
          Code:
          select leader, controlfield, datafield, subfield
            from (select orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:leader[1]', 'varchar(255)') leader,
                         orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:controlfield[1]', 'varchar(255)') controlfield,
                         orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/@tag', 'varchar(255)') datafield,
                         orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/marc21:subfield[1]', 'varchar(255)') subfield
                     from (
                            --Abfrage auf Import-Tabelle
                            select Top 1 xmlData from dbo.orgaImportHistory) xml
                    cross apply xml.xmlData.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record')) x
           where x.datafield = '..'
                 --and x.subfield = '..'
                 -- nach Bedarf
          oder auch
          Code:
           select leader, controlfield, datafield, string_agg(subfield)
            from (select orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:leader[1]', 'varchar(255)') leader,
                         orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:controlfield[1]', 'varchar(255)') controlfield,
                         orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/@tag', 'varchar(255)') datafield,
                         orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/marc21:subfield[1]', 'varchar(255)') subfield
                     from (
                            --Abfrage auf Import-Tabelle
                            select Top 1 xmlData from dbo.orgaImportHistory) xml
                    cross apply xml.xmlData.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record')) x
           where x.datafield = '..'
                 --and x.subfield = '..'  
                 -- nach Bedarf
           group by leader, controlfield, datafield

          Comment


          • #35
            Vielen Dank beo dem ersten code von dir bekomme ich Meldung:

            Code:
             Meldung 208, Ebene 16, Status 1, Zeile 1
            Ungültiger Objektname 'xml.xmlData.nodes'.
            Ich habe versucht es nachzuvollziehen, aber es klappt nicht.

            bei dem 2. Code ist 'string_agg' wird nicht als Name einer integrierten Funktion erkannt.

            Was kann ich tun?

            Comment


            • #36
              tja, ich bin kein lebender debugger, da kann ich nicht viel zu sagen. Du hast alle Bausteine dort vorliegen.
              Ist Dir klar was ich gemacht habe? Du kannst es dann selbst machen:
              select <feldnamen> from (<DasStatementVonAnna>) x where <Bedingungen>

              2 Anmerkungen noch:
              ich verwende den Alias X, das wird aber auch als XML Variable verwendet von Dir, also mein x gegen was anderes austauschen
              Zu dem Statement gehört sicher auch die XM Deklaration, die darfst Du nicht vergessen.

              Comment


              • #37
                Ja, ich hab gerade nachgeschlagen, STRING_AGG gibt es erst mit der 2017 Edition. Das wusste ich nicht.

                Es gibt dafür Workarounds, z.B. oder ähnlich:
                https://stackoverflow.com/questions/...split-function

                Comment


                • #38
                  Hi defo2, ich komme nicht klar mit identifizierung.
                  Lieben Dank für deine Links, aber da ich kein Informatiker bin, verstehe ich die Fehler nicht.

                  Comment


                  • #39
                    Dann eins nach dem anderen. Das erste Statement.

                    Du musst Deinen eigenen Code vollständig anwenden. Die Fehlermeldung sagt:
                    Code:
                    Ungültiger Objektname 'xml.xmlData.nodes'
                    Code:
                    select leader, controlfield, datafield, subfield
                    from (select orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:leader[1]', 'varchar(255)') leader,
                    orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:controlfield[1]', 'varchar(255)') controlfield,
                    orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/@tag', 'varchar(255)') datafield,
                    orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/marc21:subfield[1]', 'varchar(255)') subfield
                    from (
                    --Abfrage auf Import-Tabelle
                    select Top 1 xmlData from dbo.orgaImportHistory) xml
                    cross apply xml.xmlData.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record')) x
                    where x.datafield = '..'
                    --and x.subfield = '..'
                    -- nach Bedarf
                    Woher kommt das?

                    Du musst auch die Deklaration des XML Objects durchführen:
                    Code:
                    DECLARE @x xml
                    SET @x='<collection xmlns="http://www.loc.gov/MARC21/slim">
                        <record type="Authority">
                            <leader>00000nz a2200000nc 4500</leader>
                            <controlfield tag="001">1011387409</controlfield>
                            <controlfield tag="003">DE-101</controlfield>
                            <controlfield tag="005">20150227101359.0</controlfield>
                            <controlfield tag="008">110430n</controlfield>
                            <datafield tag="024" ind1="7" ind2=" ">
                                <subfield code="a">http://d-nb.info/brd/123</subfield>
                                <subfield code="2">uri</subfield>
                            </datafield>
                            <datafield tag="035" ind1=" " ind2=" ">
                                <subfield code="a">(DE-101)105f563</subfield>
                            </datafield>
                            <datafield tag="035" ind1=" " ind2=" ">
                                <subfield code="a">(DE-588)632a452</subfield>
                            </datafield>
                        </record>
                    </collection>'';

                    Comment


                    • #40
                      Guten Tag,

                      ich habe jetzt so geschrieben, aber sagte mir, dass die Spaltenname 'datafield' ungültig ist. Aber die Spaltenname ist oben definiert.

                      Code:
                      select
                      orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:leader[1]', 'varchar(255)') leader,
                      orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:controlfield[1]', 'varchar(255)') controlfield,
                      orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/@tag', 'varchar(255)') datafield,
                      orga.ref.value('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:datafield[1]/marc21:subfield[1]', 'varchar(255)') subfield
                      from (
                      --Abfrage auf Import-Tabelle
                      select Top 1 xmlData from dbo.orgaImportHistory) xml
                      
                      
                      cross apply xml.xmlData.nodes('declare namespace marc21="http://www.loc.gov/MARC21/slim"; marc21:collection/marc21:record') as orga(ref)
                      where datafield = '024'
                      wie /wo soll ich noch die NAme definieren?
                      Zuletzt editiert von Anna85; 13.05.2019, 12:01.

                      Comment


                      • #41
                        Hallo,
                        die Abfrage fnktioniert jetzt bei mir. Ich hätte dazu noch eine Frage:
                        Die Liste, die ich dann bekomme hat leider Sonderzeichen, deshalb, anstatt fremde Buchstaben steht $ oder?.
                        Wie und wo kann ich UTF8 Encodierung definieren?

                        lG Anna

                        Comment

                        Working...
                        X