정규 형식 및 패턴 제한 사항
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
XSD 패턴 패싯을 사용하면 단순 형식의 어휘 공간을 제한할 수 있습니다. 가능한 어휘 표현이 두 개 이상 있는 형식에 패턴 제한을 두면 유효성 검사 시 일부 값이 예기치 않은 동작을 일으킬 수 있습니다.
이 동작이 발생하는 것은 이러한 값의 어휘 표현이 데이터베이스에 저장되지 않기 때문입니다. 따라서 값은 출력으로 직렬화될 때 정규 표현으로 변환됩니다. 형식에 대한 패턴 제한을 준수하지 않는 정규형의 값이 문서에 포함된 경우 사용자가 다시 삽입하려고 하면 문서가 거부됩니다.
이를 방지하기 위해 SQL Server는 정규형의 패턴 제한 위반으로 인해 다시 삽입할 수 없는 값이 포함된 XML 문서를 거부합니다. 예를 들어 값 "33.000"은 패턴 제한이 "33\.0+"인 xs:decimal에서 파생된 형식에 대해 유효성을 검사하지 않습니다. "33.000"은 이 패턴을 준수하지만 정규형인 "33"은 그렇지 않습니다.
따라서 boolean, decimal, float, double, dateTime, time, date, hexBinary 및 base64Binary의 기본 형식에서 파생된 형식에 패턴 패싯을 적용할 때 주의해야 합니다. 이러한 구성 요소를 스키마 컬렉션에 추가할 때 SQL Server에서 경고를 보냅니다.
부동 소수점 값의 부정확한 직렬화에 비슷한 문제가 있습니다. SQL Server에서 사용하는 부동 소수점 직렬화 알고리즘으로 인해 비슷한 값이 동일한 정규형을 공유할 수 있습니다. 부동 소수점 값을 직렬화된 다음 다시 삽입하면 해당 값이 약간 변경될 수 있습니다. 드물지만 이로 인해 값을 다시 삽입한 경우 값이 해당 형식에 대해 enumeration, minInclusive, minExclusive, maxInclusive또는 maxExclusive와 같은 패싯 중 하나를 위반할 수 있습니다. 이 문제를 방지하기 위해 SQL Server에서는 직렬화 및 다시 삽입할 수 없는 xs:float
또는 xs:double
에서 파생되는 형식의 값을 모두 거부합니다.