Share via


Kanonische Formen und Musterbeschränkungen

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Das XSD-Musterfacet ermöglicht das Beschränken des lexikalischen Speicherplatzes für simple-Datentypen. Wenn eine Mustereinschränkung auf einen Typ angewendet wird, für den mehr als eine mögliche lexikalische Darstellung vorhanden ist, können einige Werte bei der Überprüfung zu unerwartetem Verhalten führen.

Dieses Verhalten tritt auf, da lexikalische Darstellungen dieser Werte nicht in der Datenbank gespeichert sind. 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 die Mustereinschränkung für den Typ nicht erfüllt, wird das Dokument abgelehnt, wenn ein Benutzer versucht, es erneut einzugeben.

Um dies zu verhindern, lehnt SQL Server jedes XML-Dokument ab, das Werte enthält, die nicht erneut eingefügt werden können, aufgrund der Verletzung von Mustereinschränkungen durch ihre kanonischen Formen. Der Wert "33.000" wird beispielsweise nicht anhand eines Typs überprüft, der von "xs:decimal " abgeleitet ist, wobei die Mustereinschränkung "33\.0+" festgelegt ist. Obwohl "33.000" diesem Muster entspricht, ist die kanonische Form "33" nicht der Fall.

Daher sollten Sie vorsichtig sein, wenn Sie Musterfacets auf Typen anwenden, die von den folgenden Grundtypen abgeleitet wurden: boolean, decimal, float, double, dateTime, time, date, hexBinaryund base64Binary. SQL Server gibt eine Warnung aus, wenn Sie einer Schemaauflistung solche Komponenten hinzufügen.

Die unpräzise Serialisierung von Gleitkommawerten weist ein ähnliches Problem auf. Aufgrund des gleitkommabasierten Serialisierungsalgorithmus, der von SQL Server verwendet wird, ist es möglich, dass ähnliche Werte dieselbe kanonische Form gemeinsam nutzen. 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, maxInclusiveoder maxExclusive. Um dies zu verhindern, lehnt SQL Server alle Werte von Typen ab, die von xs:float oder xs:double die nicht serialisiert und erneut eingefügt werden können.

Siehe auch