Condividi tramite


Forme canoniche e restrizioni di pattern

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure

Il facet basato su pattern XSD consente la restrizione dello spazio lessicale di tipi semplici. Quando viene applicata una restrizione dei criteri a un tipo per il quale esistono più rappresentazioni lessicali possibili, alcuni valori potrebbero causare un comportamento imprevisto al momento della convalida.

Tale comportamento si verifica in quanto le rappresentazioni lessicali di questi valori non vengono archiviate nel database. Pertanto, i valori vengono convertiti nelle rappresentazioni canoniche corrispondenti quando serializzati come output. Se un documento contiene un valore la cui forma canonica non è conforme alla restrizione del criterio per il tipo corrispondente, il documento verrà rifiutato nel caso in cui un utente tenti di reinserirlo.

Per evitare tale problema, SQL Server rifiuta qualsiasi documento XML contenente valori che non è possibile reinserire, a causa della violazione delle restrizioni di pattern da parte delle forme canoniche corrispondenti. Ad esempio, il valore "33.000" non verrà convalidato in base a un tipo derivato da xs:decimal con una restrizione di criterio "33\.0+". Sebbene il valore "33.000" sia conforme a tale criterio, la forma canonica "33" non lo è.

Di conseguenza, è necessario prestare attenzione quando si applicano facet basati su modelli a tipi derivati dai seguenti tipi primitivi: boolean, decimal, float, double, dateTime, time, date, hexBinarye base64Binary. viene generato un avviso quando tali componenti vengono aggiunti a una raccolta di schemi.

Per la serializzazione imprecisa di valori a virgola mobile esiste un problema analogo. A causa dell'algoritmo di serializzazione per i valori a virgola mobile utilizzato da SQL Server, è possibile che valori simili condividano la stessa forma canonica. Quando un valore a virgola mobile viene serializzato e quindi reinserito, potrebbe subire una leggera variazione. In casi rari, il risultato può essere un valore che viola uno dei facet seguenti per il tipo corrispondente al momento del reinserimento: enumeration, minInclusive, minExclusive, maxInclusiveo maxExclusive. Per evitare tale problema, SQL Server rifiuta i valori di tipi derivati da xs:float o xs:double che non è possibile serializzare e reinserire.

Vedi anche