Share via


Kanonische Formen und Musterbeschränkungen

Das XSD-Musterfacet ermöglicht das Beschränken des lexikalischen Speicherplatzes für simple-Datentypen. Wenn einem Datentyp eine Musterbeschränkung auferlegt wird, für den mehrere mögliche lexikalische Darstellungen vorhanden sind, können einige Werte bei der Überprüfung unerwartetes Verhalten bewirken.

Dieses Verhalten tritt auf, weil die lexikalischen Darstellungen dieser Werte nicht in der Datenbank gespeichert werden. Daher werden die Werte in ihre kanonischen Darstellungen konvertiert, wenn sie als Ausgabe serialisiert werden. Wenn ein Dokument einen Wert enthält, dessen kanonische Form nicht der Musterbeschränkung für seinen Datentyp genügt, wird das Dokument zurückgewiesen, wenn ein Benutzer versucht, diesen Wert erneut einzufügen.

Um dies zu verhindern, lehnt SQL Server alle XML-Dokumente ab, die Werte enthalten, die nicht erneut eingefügt werden können, weil ihre kanonischen Formen die Musterbeschränkung verletzen. Die Überprüfung des Wertes "33.000" mit einem von xs:decimal abgeleiteten Datentyp mit einer Musterbeschränkung von "33\.0+" schlägt z. B. fehl. Zwar genügt "33.000" diesem Muster, die kanonische Form "33" jedoch nicht.

Aus diesem Grund sollten Sie sehr sorgfältig vorgehen, wenn Sie Musterfacets auf Datentypen anwenden, die aus den folgenden primitiven Datentypen abgeleitet sind: boolean, decimal, float, double, dateTime, time, date, hexBinary und base64Binary. SQL Server gibt eine Warnung aus, wenn Sie eine dieser Komponenten einer Schemaauflistung hinzufügen.

Die unpräzise Serialisierung von Gleitkommawerten weist ein ähnliches Problem auf. Aufgrund des von SQL Server verwendeten Gleitkommaserialisierungsalgorithmus ist es möglich, dass ähnliche Werte die gleiche kanonische Form gemeinsam verwenden. Wenn ein Gleitkommawert serialisiert und dann erneut eingefügt wird, kann sich sein Wert geringfügig ändern. In seltenen Fällen kann dieser Vorgang zu einem Wert führen, der einen der folgendes Facets für seinen Datentyp beim erneuten Einfügen verletzt: enumeration, minInclusive, minExclusive, maxInclusive oder maxExclusive. Damit dies verhindert wird, weist SQL Server alle Werte von Datentypen zurück, die von xs:float oder xs:double abgeleitet sind und nicht serialisiert und erneut eingefügt werden können.