none
XML Abfrage auf Attribute RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine kurze Frage zum Handling mit XML.

    Derzeit bin ich am abklären der Möglichkeiten um XML-Daten abzufragen, da kenne ich mich (noch) nicht aus. Zum darstellen was ich benötige, habe ich ein Beispiel-Datensatz erstellt und versuche mich gerade daran.

    declare @WohnungsProfile XML =
    '<?xml version="1.0"?>
    <Wohnungen>
    	<Wohnung VermietetAb="2017-03-17 00:00:00" WohnungID="10-5-2" MieterName="Max Mustermann" Eintrag="keiner">
    		<WeitereInfo>
    			<Kueche />
    			<Bad />
    			<Wohnzimmer />
    			<Zimmer>4</Zimmer>
    			<Eigentuemer Name="Vermieter 1" Adresse="Strasse und Wohnort" Eigenbedarf="Möglich oder Nein" />
    		</WeitereInfo>
    	</Wohnung>
    </Wohnungen>'
    
    SELECT
    	x.Rec.query('./WeitereInfo/Zimmer').value('.', 'nvarchar(max)'),
    	x.Rec.query('.').value('@VermietetAb[1]', 'nvarchar(max)')
    FROM @WohnungsProfile.nodes('/Wohnungen/Wohnung') as x(Rec)

    Die Abfrage klappt soweit wenn ich nicht auf ein einzelnes Attribut von <Wohnungen><Wohnung> zugreife, für die Anzahl Zimmer klappt es ohne weiteres.

    Mein Problem, ich verstehe nicht wie das mit Query() läuft.

    Zuvor hatte ich noch andere XML-Dateien, die haben geklappt, haben aber auch keine Attribute in einem Key.

    Für etwas Hilfe wäre ich Euch sehr dankbar.

    Viele Grüsse,

    Daniel

    Montag, 4. November 2019 09:04

Antworten

  • Hallo Daniel,

    wieso willst Du hier mit query() arbeiten, value() reicht doch völlig aus:

    declare @WohnungsProfile XML =
    '<?xml version="1.0"?>
    <Wohnungen>
    	<Wohnung VermietetAb="2017-03-17 00:00:00" WohnungID="10-5-2" MieterName="Max Mustermann" Eintrag="keiner">
    		<WeitereInfo>
    			<Kueche />
    			<Bad />
    			<Wohnzimmer />
    			<Zimmer>4</Zimmer>
    			<Eigentuemer Name="Vermieter 1" Adresse="Strasse und Wohnort" Eigenbedarf="Möglich oder Nein" />
    		</WeitereInfo>
    	</Wohnung>
    </Wohnungen>'
    
    SELECT x.Rec.value('(WeitereInfo/Zimmer)[1]', 'int'),
           x.Rec.value('(WeitereInfo/Eigentuemer)[1]/@Name', 'nvarchar(max)')
    FROM @WohnungsProfile.nodes('/Wohnungen/Wohnung') as x(Rec)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert DniBo Montag, 4. November 2019 11:12
    Montag, 4. November 2019 10:03

Alle Antworten

  • Hallo Daniel,

    wieso willst Du hier mit query() arbeiten, value() reicht doch völlig aus:

    declare @WohnungsProfile XML =
    '<?xml version="1.0"?>
    <Wohnungen>
    	<Wohnung VermietetAb="2017-03-17 00:00:00" WohnungID="10-5-2" MieterName="Max Mustermann" Eintrag="keiner">
    		<WeitereInfo>
    			<Kueche />
    			<Bad />
    			<Wohnzimmer />
    			<Zimmer>4</Zimmer>
    			<Eigentuemer Name="Vermieter 1" Adresse="Strasse und Wohnort" Eigenbedarf="Möglich oder Nein" />
    		</WeitereInfo>
    	</Wohnung>
    </Wohnungen>'
    
    SELECT x.Rec.value('(WeitereInfo/Zimmer)[1]', 'int'),
           x.Rec.value('(WeitereInfo/Eigentuemer)[1]/@Name', 'nvarchar(max)')
    FROM @WohnungsProfile.nodes('/Wohnungen/Wohnung') as x(Rec)


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert DniBo Montag, 4. November 2019 11:12
    Montag, 4. November 2019 10:03
  • Hi Olaf,

    danke für die Antwort :-)

    Ich hatte mit XML noch keine Berührung und mich gestern mit verschiedenen Abfragen beschäftigt, dabei das System wohl noch nicht verstanden...

    Mit Query dachte ich passend zu sein da ich mehr als nur ein Block von "Wohnung" habe.

    Zu Deiner Lösung, wie komme ich an den Attribut-Wert "VermietetAb" von "Wohnung", wie setze ich die Abfrage wenn ich auf der gleichen Eben wie mit Nodes gesetzt abfrage?

    Gruss,
    Daniel


    • Bearbeitet DniBo Montag, 4. November 2019 11:00 Korrektur
    Montag, 4. November 2019 10:59
  • Hi Olaf,

    gefunden, einfach mal genau überlegen :-)

    x.Rec.value('(.)[1]/@VermietetAb', 'nvarchar(max)')

    Viele Grüsse,
    Daniel

    Montag, 4. November 2019 11:12