Compartir a través de


Formas canónicas y restricciones de patrón

El aspecto de patrón XSD permite la restricción del espacio léxico de tipos simples. Cuando se aplica una restricción de patrón en un tipo para el cual existen varias representaciones léxicas posibles, algunos valores pueden provocar un comportamiento inesperado en el momento de 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 cuya forma canónica no cumple la restricción de patrón de su tipo, el documento se rechaza si un usuario intenta volver a insertarlo.

Para evitar este problema, SQL Server rechazará los documentos XML que contengan valores que no se pueden volver a insertar, puesto que sus formas canónicas infringen las restricciones de patrón. 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 este patrón, la forma canónica, "33", no lo cumple.

Por ello, es preciso tener cuidado al aplicar aspectos de patrón a los tipos derivados de los tipos primitivos siguientes: boolean, decimal, float, double, dateTime, time, date, hexBinary y 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. Puesto que SQL Server usa un algoritmo de serialización de coma flotante, los valores similares pueden compartir 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 alguno de los siguientes aspectos para este tipo en la reinserción: enumeration, minInclusive, minExclusive, maxInclusive o maxExclusive. Para evitarlo, SQL Server rechaza los valores de tipos derivados de xs:float o xs:double que no se pueden serializar y volver a insertar.