Formas canônicas e restrições de padrões

A faceta de padrão XSD permite restringir o espaço léxico de tipos simples. Quando uma restrição de padrão é colocada em um tipo para o qual há mais de uma representação léxica possível, alguns valores podem provocar comportamento inesperado na validação.

Esse comportamento ocorre porque representações léxicas desses valores não são armazenados no banco de dados. Portanto os valores são convertidos em suas representações canônicas quando serializados como saída. Se um documento contiver um valor cuja forma canônica não está em conformidade com a restrição de padrão de seu tipo, o documento será rejeitado se um usuário tentar reinseri-lo.

Para evitar isso, o SQL Server rejeita qualquer documento XML que contenha valores que não podem ser reinseridos, por causa da violação de restrições de padrão por suas formas canônicas. Por exemplo, o valor "33.000" não é validado em relação a um tipo derivado de xs:decimal com uma restrição de padrão de "33\.0+". Embora "33.000" obedeça a esse padrão, a forma canônica, "33", não obedece.

Portanto, deve-se ter cuidado ao aplicar facetas de padrão a tipos derivados dos seguintes tipos primitivos: boolean, decimal, float, double, dateTime, time, date, hexBinary e base64Binary. O SQL Server emite um aviso quando qualquer componente desse tipo é adicionado a um coleção de esquemas.

A serialização imprecisa de valores de ponto flutuante tem um problema semelhante. Por causa do algoritmo de serialização de ponto flutuante usado pelo SQL Server, é possível que valores semelhantes compartilhem a mesma forma canônica. Quando um valor de ponto flutuante é serializado e reinserido, seu valor pode ser ligeiramente alterado. Em casos raros, isso pode resultar em um valor que viola qualquer uma das facetas de seu tipo na reinserção: enumeration, minInclusive, minExclusive, maxInclusive ou maxExclusive. Para evitar isso, o SQL Server rejeita todos os valores de tipos derivados de xs:float ou xs:double que não podem ser serializados e reinseridos.