Compartilhar via


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

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

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

Esse comportamento ocorre porque as representações léxicas desses valores não são armazenadas 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 esteja em conformidade com a restrição de padrão para seu tipo, o documento será rejeitado quando um usuário tentar reinseri-lo.

Para evitar isso, o SQL Server rejeita qualquer documento XML que contenha valores que não possam ser reinseridos devido à violação das 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" esteja em conformidade com esse padrão, a forma canônica, "33", não está.

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, hexBinarye base64Binary. O SQL Server emite um aviso quando você adiciona qualquer um desses componentes a uma coleção de esquema.

A serialização imprecisa de valores de ponto flutuante tem um problema semelhante. Devido ao algoritmo de serialização de pontos flutuantes 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, maxInclusiveou maxExclusive. Para evitar isso, o SQL Server rejeita quaisquer valores de tipos derivados de xs:float ou xs:double que não possam ser serializados e reinseridos.

Confira também