none
XML AUTO RRS feed

  • Frage

  • Abhängige Tabellen, eine Master, meherere Details.

    create table tmaster (feld_a1 int, feld_a2 int)

    create table tdetail (feld_b1_a1 int, feld_b2 int)

    insert tmaster values (1, 100)

    insert tdetail values (1, 4711)

    insert tdetail values (1, 4712)

    Mit diesem Selekt

    select

          feld_a1 KopfNr,

          feld_b2 PosNr

    from tmaster master

    join tdetail detail on feld_a1 = feld_b1_a1

    where feld_a1 = 1

    FOR XML AUTO, ROOT('root');

    erhalte ich:

    <root>

      <master KopfNr="1">

        <detail PosNr="4711" />

        <detail PosNr="4712" />

      </master>

    </root>

    Brauche es aber in der Form:

    <root>
          <master KopfNr = "1" </master>

          <detail PosNr = "4711"</detail>

          <detail PosNr = "4712"</detail>

    </root>

    Wie muss ich abfragen?
    Vielen Dank im Voraus.

    Donnerstag, 23. Mai 2013 10:31

Antworten

  • Hallo Stefan,

    wenn es in der Frage wegen des Schlüssel so aussieht als ob das nicht der Fall wäre, sollte es auch gehen:

    SELECT x.*
    FROM @tmaster AS s
    CROSS APPLY (SELECT
        1 as Tag,
        0 as Parent,
        master.feld_a1 AS [master!1!KopfNr],
        null    AS [detail!2!PosNr]
    FROM @tmaster AS master
    where master.feld_a1 = s.feld_a1
    UNION ALL
    SELECT 
        2 as Tag,
        0 as Parent,
        null,
        feld_b2  
    from @tmaster as master
    INNER JOIN @tdetail AS detail ON feld_a1 = feld_b1_a1
    WHERE master.feld_a1 = s.feld_a1) AS x
    FOR XML EXPLICIT, ROOT('root');
    Gruß Elmar

    Donnerstag, 23. Mai 2013 15:27
  • Hallo,

    das ginge über den EXPLICIT Modus:

    SELECT
        1 as Tag,
        0 as Parent,
        feld_a1 AS [master!1!KopfNr],
        null    AS [detail!2!PosNr]
    FROM tmaster AS master
    WHERE feld_a1 = 1
    UNION ALL
    SELECT
        2 as Tag,
        0 as Parent,
        null,
        feld_b2  
    from tmaster as master
    INNER JOIN tdetail AS detail ON feld_a1 = feld_b1_a1
    WHERE feld_a1 = 1
    FOR XML EXPLICIT, ROOT('root');

    siehe auch: Beispiel: Erstellen von gleichgeordneten Elementen im EXPLICIT-Modus

    Gruß Elmar


    Donnerstag, 23. Mai 2013 13:06
  • Caveat: Das gilt aber nur für den speziellen Fall das nur ein Hauptdatensatz da ist.

    DECLARE @tmaster TABLE (feld_a1 int, feld_a2 int);
    DECLARE @tdetail TABLE (feld_b1_a1 int, feld_b2 int)
    insert @tmaster values (1, 100)
    insert @tdetail values (1, 4711)
    insert @tdetail values (1, 4712)
    insert @tmaster values (2, 200)
    insert @tdetail values (2, 4811)
    insert @tdetail values (2, 4812)
    
    SELECT
        1 as Tag,
        0 as Parent,
        feld_a1 AS [master!1!KopfNr],
        null    AS [detail!2!PosNr]
    FROM @tmaster AS master
    UNION ALL
    SELECT 
        2 as Tag,
        0 as Parent,
        null,
        feld_b2  
    from @tmaster as master
    INNER JOIN @tdetail AS detail ON feld_a1 = feld_b1_a1
    FOR XML EXPLICIT, ROOT('root');

    Donnerstag, 23. Mai 2013 13:52

Alle Antworten

  • hmm, hier ist mir auch keine direkte Lösung bekannt, da dieses Format ja die Hierarchie über den Haufen wirft. Allerdings kannst du aus deinem Ergebnis mittels XSLT das gewünschte Ergebnis ganz leicht erzeugen.
    Donnerstag, 23. Mai 2013 11:59
  • Hallo,

    das ginge über den EXPLICIT Modus:

    SELECT
        1 as Tag,
        0 as Parent,
        feld_a1 AS [master!1!KopfNr],
        null    AS [detail!2!PosNr]
    FROM tmaster AS master
    WHERE feld_a1 = 1
    UNION ALL
    SELECT
        2 as Tag,
        0 as Parent,
        null,
        feld_b2  
    from tmaster as master
    INNER JOIN tdetail AS detail ON feld_a1 = feld_b1_a1
    WHERE feld_a1 = 1
    FOR XML EXPLICIT, ROOT('root');

    siehe auch: Beispiel: Erstellen von gleichgeordneten Elementen im EXPLICIT-Modus

    Gruß Elmar


    Donnerstag, 23. Mai 2013 13:06
  • Caveat: Das gilt aber nur für den speziellen Fall das nur ein Hauptdatensatz da ist.

    DECLARE @tmaster TABLE (feld_a1 int, feld_a2 int);
    DECLARE @tdetail TABLE (feld_b1_a1 int, feld_b2 int)
    insert @tmaster values (1, 100)
    insert @tdetail values (1, 4711)
    insert @tdetail values (1, 4712)
    insert @tmaster values (2, 200)
    insert @tdetail values (2, 4811)
    insert @tdetail values (2, 4812)
    
    SELECT
        1 as Tag,
        0 as Parent,
        feld_a1 AS [master!1!KopfNr],
        null    AS [detail!2!PosNr]
    FROM @tmaster AS master
    UNION ALL
    SELECT 
        2 as Tag,
        0 as Parent,
        null,
        feld_b2  
    from @tmaster as master
    INNER JOIN @tdetail AS detail ON feld_a1 = feld_b1_a1
    FOR XML EXPLICIT, ROOT('root');

    Donnerstag, 23. Mai 2013 13:52
  • Hallo Stefan,

    wenn es in der Frage wegen des Schlüssel so aussieht als ob das nicht der Fall wäre, sollte es auch gehen:

    SELECT x.*
    FROM @tmaster AS s
    CROSS APPLY (SELECT
        1 as Tag,
        0 as Parent,
        master.feld_a1 AS [master!1!KopfNr],
        null    AS [detail!2!PosNr]
    FROM @tmaster AS master
    where master.feld_a1 = s.feld_a1
    UNION ALL
    SELECT 
        2 as Tag,
        0 as Parent,
        null,
        feld_b2  
    from @tmaster as master
    INNER JOIN @tdetail AS detail ON feld_a1 = feld_b1_a1
    WHERE master.feld_a1 = s.feld_a1) AS x
    FOR XML EXPLICIT, ROOT('root');
    Gruß Elmar

    Donnerstag, 23. Mai 2013 15:27
  • Hallo,

    ich bin's nochmal.

    Leider habe ich feststellen müssen dass EXPLICIT nicht mit WITH XMLNAMESPACES zusammenpasst. Gibt es da eine Möglichkeit z.B. über temporäre Tabelle, Variable o.ä.?
    Würde mir den Umweg mit XSLT gerne ersparen...

    Vielen Dank und schönes Wochenende.

    Freitag, 24. Mai 2013 10:07