Announcement

Collapse
No announcement yet.

XML Abfrage bzw. Vergleich von XML-Typ und Varchar

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

  • XML Abfrage bzw. Vergleich von XML-Typ und Varchar

    Hallo,

    ich möchte in etwa folgende Abfrage in SQL Server 2005 realisieren:

    SELECT [Id]
    FROM [Anmeldesystem].[dbo].[Parameterliste]
    WHERE Zulassungskriterium = 1
    AND XMLStream = '<?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="XMLSchema" targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Sonderpruefung">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="Pruefungsnummer" minOccurs="1" maxOccurs="1" type="xs:string" />
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    </xs:schema>'

    Das Attribut XMLStream ist vom Typ xml. Das "XML" mit dem ich XMLStream vergleichen möchte ist ein varchar-Element.
    Das Problem ist natürlich: "Die Datentypen xml und varchar sind im equal to-Operator inkompatibel."

    Wie stellt man denn so eine Anfrage richtig? Evtl. irgendwas mit XQuery?

    Viele Grüße,
    Peejay

  • #2
    Hallo,

    selbst wenn der SQL Server die Datentypen automatisch transformieren würde, ist der Zeichenkettenvergleich unbrauchbar. Der SQL Server 2005 speichert die XML-Daten nicht als Text, sondern splittet die Informationen auf (er entfernt die Füllwerte, die XML in der Textdarstellung aufblähen). Der Query Optimizer vom SQL Server 2005 ist daher in der Lage, die Spaltenstruktur des XML-Dokuments effizient auszulesen. Mit einem kurzen SQL-Batch sind diese Unterschiede erkennbar. Während die XML-Zeichenkette in der NVARCHAR-Variablen 276 Bytes umfasst, benötigt der XML-Datentyp nur 142 Bytes, um die gleichen Informationen zu speichern

    <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;"><span style="color: green;">-- Testdaten</span></p><p style="margin: 0px;"><span style="color: blue;">DECLARE </span>@XMLDaten NVARCHAR(<span style="color: blue;">MAX</span>);</p><p style="margin: 0px;"><span style="color: blue;">SET </span>@XMLDaten = <span style="color: #a31515;">'&lt;?xml version="1.0"?&gt;</span></p><p style="margin: 0px;"><span style="color: #a31515;">&lt;table&gt;</span></p><p style="margin: 0px;"><span style="color: #a31515;">&lt;row&gt;&lt;id&gt;1&lt;/id&gt;&lt;wert&gt;Hallo Welt&lt;/wert&gt;&lt;/row&gt;</span></p><p style="margin: 0px;"><span style="color: #a31515;">&lt;row&gt;&lt;id&gt;2&lt;/id&gt;&lt;wert&gt;Das ist ein Test&lt;/wert&gt;&lt;/row&gt;</span></p><p style="margin: 0px;"><span style="color: #a31515;">&lt;/table&gt;'</span>;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Testdaten in XML-Variable ablegen</span></p><p style="margin: 0px;"><span style="color: blue;">DECLARE </span>@XMLPuffer XML;</p><p style="margin: 0px;"><span style="color: blue;">SET </span>@XMLPuffer = <span style="color: blue;">CAST</span>(@XMLDaten <span style="color: blue;">AS </span>XML);</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">-- Größe vergleichen</span></p><p style="margin: 0px;"><span style="color: blue;">SELECT DATALENGTH</span>(@XMLDaten)&nbsp; <span style="color: blue;">AS </span>"NVARCHAR-Länge", </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <span style="color: blue;">DATALENGTH</span>(@XMLPuffer) <span style="color: blue;">AS </span>"XML-Länge"</p></div>

    Wie stellt man denn so eine Anfrage richtig? Evtl. irgendwas mit XQuery?
    Ja - das wäre ein geeigneter Weg.

    <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;"><span style="color: blue;">DECLARE </span>@x XML;</p><p style="margin: 0px;"><span style="color: blue;">SET </span>@x = <span style="color: #a31515;">'</span></p><p style="margin: 0px;"><span style="color: #a31515;">&lt;Kunden&gt;</span></p><p style="margin: 0px;">&nbsp; <span style="color: #a31515;">&lt;dbo.Kunden&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">&lt;kdnnr&gt;1&lt;/kdnnr&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">&lt;kunde&gt;Mustermann&lt;/kunde&gt;</span></p><p style="margin: 0px;">&nbsp; <span style="color: #a31515;">&lt;/dbo.Kunden&gt;</span></p><p style="margin: 0px;">&nbsp; <span style="color: #a31515;">&lt;dbo.Kunden&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">&lt;kdnnr&gt;2&lt;/kdnnr&gt;</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: #a31515;">&lt;kunde&gt;Musterfrau&lt;/kunde&gt;</span></p><p style="margin: 0px;">&nbsp; <span style="color: #a31515;">&lt;/dbo.Kunden&gt;</span></p><p style="margin: 0px;"><span style="color: #a31515;">&lt;/Kunden&gt;'</span>;</p><p style="margin: 0px;"><span style="color: blue;">SELECT </span>@x.query(<span style="color: #a31515;">'for $b in /Kunden/dbo.Kunden where $b/kdnnr=1 return ($b)'</span>) <span style="color: blue;">AS </span><span style="color: #a31515;">'XQuery-Ergebnis'</span>;</p><p style="margin: 0px;">GO</p></div>

    Comment


    • #3
      Hi Andreas!

      Danke für deinen Beitrag! Ich habe mich jetzt entschlossen, das Problem in meinem Programmcode abzufangen. Da kann ich mir mittels eines SELECT Statements den Inhalt der XML-Spalte als String zurückgeben lassen und dann vergleichen.

      Jedenfalls danke nochmals!

      Viele Grüße,
      Peejay

      Comment

      Working...
      X