Condividi tramite


Forme canoniche e restrizioni di pattern

Il facet basato su pattern XSD consente la restrizione dello spazio lessicale di tipi semplici. Quando viene applicata una restrizione di pattern 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 di pattern 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 pattern "33\.0+". Sebbene il valore "33.000" sia conforme a tale pattern, la forma canonica "33" non lo è.

Di conseguenza, è necessario prestare attenzione quando si applicano facet basati su pattern a tipi derivati dai seguenti tipi primitivi: boolean, decimal, float, double, dateTime, time, date, hexBinary e base64Binary. In SQL Server viene generato un avviso quando tali componenti vengono aggiunti a un insieme 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, maxInclusive o maxExclusive. Per evitare tale problema, SQL Server rifiuta i valori di tipi derivati da xs:float o xs:double che non è possibile da serializzare e reinserire.