Compartir vía


Formas canónicas y restricciones de patrón

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

La faceta de patrón XSD permite la restricción del espacio léxico de tipos simples. Cuando se coloca una restricción de patrón en un tipo para el que hay más de una posible representación léxica, algunos valores podrían provocar un comportamiento inesperado tras la validación.

Este comportamiento se produce porque las representaciones léxicas de estos valores no se almacenan en la base de datos. Por tanto, los valores se convierten en sus representaciones canónicas cuando se serializan como salida. Si un documento contiene un valor cuyo formato canónico no cumple con la restricción de patrón para su tipo, el documento se rechaza si un usuario intenta volver a insertarlo.

Para evitar esto, SQL Server rechaza cualquier documento XML que contenga valores que no se pueden reinsertar, debido a la infracción de restricciones de patrón por sus formas canónicas. Por ejemplo, el valor "33.000" no se valida con un tipo derivado de xs:decimal con una restricción de patrón de "33\.0+". Aunque "33.000" cumple con este patrón, no lo hace la forma canónica "33".

Por ello, es preciso tener cuidado al aplicar facetas de patrón a los tipos derivados de los tipos primitivos siguientes: boolean, decimal, float, double, dateTime, time, date, hexBinaryy base64Binary. SQL Server muestra una advertencia si agrega alguno de esos componentes a una colección de esquemas.

La serialización imprecisa de valores de coma o punto flotante tiene un problema similar. Debido al algoritmo de serialización de punto flotante usado por SQL Server, es posible que valores similares compartan la misma forma canónica. Cuando se serializa un valor de coma flotante y a continuación se vuelve a insertar, puede que su valor cambie ligeramente. En casos excepcionales, puede obtenerse un valor que infrinja alguna de las siguientes facetas para este tipo en la reinserción: enumeration, minInclusive, minExclusive, maxInclusiveo maxExclusive. Para evitar esto, SQL Server rechaza los valores de tipos derivados de xs:float o xs:double que no se pueden serializar y reinsertar.

Consulte también