Bentuk kanonis dan pembatasan pola

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Faset pola XSD memungkinkan pembatasan ruang leksikal jenis sederhana. Ketika pembatasan pola diletakkan pada jenis yang ada lebih dari satu kemungkinan representasi leksikal, beberapa nilai dapat menyebabkan perilaku tak terduga setelah validasi.

Perilaku ini terjadi karena representasi leksikal dari nilai-nilai ini tidak disimpan dalam database. Oleh karena itu, nilai dikonversi ke representasi kanonisnya saat diserialisasikan sebagai output. Jika dokumen berisi nilai yang bentuk kanonisnya tidak mematuhi pembatasan pola untuk jenisnya, dokumen akan ditolak jika pengguna mencoba memasukkannya kembali.

Untuk mencegah hal ini, SQL Server menolak dokumen XML apa pun yang berisi nilai yang tidak dapat diinserksi ulang, karena pelanggaran pembatasan pola dengan bentuk kanonisnya. Misalnya, nilai "33.000" tidak memvalidasi terhadap jenis yang berasal dari xs:desimal dengan pembatasan pola "33\.0+". Meskipun "33.000" mematuhi pola ini, bentuk kanonis, "33", tidak.

Oleh karena itu, Anda harus berhati-hati ketika Anda menerapkan faset pola ke jenis yang berasal dari jenis primitif berikut: boolean, desimal, float, ganda, dateTime, waktu, tanggal, hexBinary, dan base64Binary. SQL Server mengeluarkan peringatan saat Anda menambahkan komponen tersebut ke kumpulan skema.

Serialisasi nilai floating-point yang tidak tepat memiliki masalah serupa. Karena algoritma serialisasi floating-point yang digunakan oleh SQL Server, dimungkinkan bagi nilai serupa untuk berbagi bentuk kanonis yang sama. Ketika nilai floating-point diserialisasikan dan kemudian dimasukkan ulang, nilainya mungkin sedikit berubah. Dalam kasus yang jarang terjadi, ini dapat mengakibatkan nilai yang melanggar salah satu faset berikut karena jenisnya pada penginserhan ulang: enumerasi, minInclusive, minExclusive, maxInclusive, atau maxExclusive. Untuk mencegah hal ini, SQL Server menolak nilai jenis apa pun yang berasal dari xs:float atau xs:double yang tidak dapat diserialisasikan dan diserialisasikan ulang.

Baca juga