Menentukan serialisasi data XML

Berlaku untuk:yes SQL Server (semua versi yang didukung) YesAzure SQL Database

Saat mentransmisikan tipe data xml secara eksplisit atau implisit ke string SQL atau jenis biner, konten tipe data xml akan diserialisasikan sesuai dengan aturan yang diuraikan dalam artikel ini.

Pengodean serialisasi

Jika jenis target SQL adalah VARBINARY, hasilnya diserialisasikan dalam UTF-16 dengan tanda urutan UTF-16-byte di depan, tetapi tanpa deklarasi XML. Jika jenis target terlalu kecil, kesalahan akan muncul.

Contohnya:

select CAST(CAST(N'<Δ/>' as XML) as VARBINARY(MAX))

Ini adalah hasilnya:

0xFFFE3C0094032F003E00

Jika jenis target SQL adalah NVARCHAR atau NCHAR, hasilnya diserialisasikan dalam UTF-16 tanpa tanda urutan byte di depan dan tanpa deklarasi XML. Jika jenis target terlalu kecil, kesalahan akan muncul.

Contohnya:

select CAST(CAST(N'<Δ/>' as XML) as NVARCHAR(MAX))

Ini adalah hasilnya:

<Δ/>

Jika jenis target SQL adalah VARCHAR atau CHAR, hasilnya diserialisasikan dalam pengodean yang sesuai dengan halaman kode kolase database tanpa tanda urutan byte atau deklarasi XML. Jika jenis target terlalu kecil atau nilai tidak dapat dipetakan ke halaman kode kolase target, kesalahan akan muncul.

Contohnya:

select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))

Ini dapat mengakibatkan kesalahan, jika halaman kode kolase saat ini tidak dapat mewakili karakter Unicode Δ, atau akan mewakilinya dalam pengodean tertentu.

Saat mengembalikan hasil XML ke sisi klien, data akan dikirim dalam pengodean UTF-16. Penyedia sisi klien kemudian akan mengekspos data sesuai dengan aturan API-nya.

Serialisasi struktur XML

Konten jenis data xml diserialisasikan dengan cara yang biasa. Secara khusus, simpul elemen dipetakan ke markup elemen, dan simpul teks dipetakan ke konten teks. Namun, keadaan di mana karakter diberi hak dan bagaimana nilai atom yang diketik diserialisasikan dijelaskan di bagian berikut.

Hak karakter XML selama serialisasi

Setiap struktur XML berseri harus mampu direparasi. Oleh karena itu, beberapa karakter harus diserialisasikan dengan cara yang berhak untuk mempertahankan kemampuan round-trip karakter melalui fase normalisasi pengurai XML. Namun, beberapa karakter harus diberi hak sehingga dokumen terbentuk dengan baik dan, oleh karena itu, dapat diurai. Berikut ini adalah aturan hak yang berlaku selama serialisasi:

  • &Karakter , <, dan > selalu diberi hak untuk &amp;, , &lt;dan &gt; masing-masing, jika karakter tersebut terjadi di dalam nilai atribut atau konten elemen.

  • Karena SQL Server menggunakan tanda kutip (U+0022) untuk mengapit nilai atribut, tanda kutip dalam nilai atribut diberi hak sebagai &quot;.

  • Pasangan pengganti berhak sebagai referensi karakter numerik tunggal, saat transmisi di server saja. Misalnya, pasangan pengganti U+D800 U+DF00 berhak atas referensi &#x00010300;karakter numerik .

  • Untuk melindungi TAB (U+0009) dan linefeed (LF, U+000A) agar tidak dinormalisasi selama penguraian, mereka berhak atas referensi &#x9; karakter numerik mereka dan &#xA; masing-masing, di dalam nilai atribut.

  • Untuk mencegah pengembalian pengangkutan (CR, U+000D) dinormalisasi selama penguraian, itu berhak atas referensi karakter numeriknya, &#xD; di dalam nilai atribut dan konten elemen.

  • Untuk melindungi simpul teks yang hanya berisi spasi kosong, salah satu karakter spasi putih, umumnya yang terakhir, berhak sebagai referensi karakter numeriknya. Dengan cara ini, membandingkan ulang mempertahankan simpul teks spasi putih, terlepas dari pengaturan penanganan spasi putih selama penguraian.

Contohnya:

DECLARE @u NVARCHAR(50)
set @u = N'<a a="
    '+NCHAR(0xD800)+NCHAR(0xDF00)+N'>">   '+NCHAR(0xA)+N'</a>'
SELECT CAST(CONVERT(XML,@u,1) as NVARCHAR(50));

Ini adalah hasilnya:

<a a="
    𐌀>">
</a>

Jika Anda tidak ingin menerapkan aturan perlindungan spasi putih terakhir, Anda bisa menggunakan opsi CONVERT eksplisit 1 saat mentransmisikan dari xml ke string atau jenis biner. Misalnya, untuk menghindari hak, Anda dapat melakukan hal berikut:

SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a>   </a>', 1), 1);

Metode query() (Tipe Data xml) menghasilkan instans jenis data xml. Oleh karena itu, setiap hasil dari query() metode yang ditransmisikan ke string atau jenis biner diberi hak sesuai dengan aturan yang dijelaskan sebelumnya. Jika Anda ingin mendapatkan nilai string yang tidak berhak, Anda harus menggunakan metode value() (Tipe Data xml) sebagai gantinya. Berikut ini adalah contoh penggunaan query() metode :

DECLARE @x xml
SET @x = N'<a>This example contains an entitized char: <.</a>'
SELECT @x.query('/a/text()');

Ini adalah hasilnya:

This example contains an entitized char: <.

Berikut ini adalah contoh penggunaan value() metode :

SELECT @x.value('(/a/text())[1]', 'nvarchar(100)');

Ini adalah hasilnya:

This example contains an entitized char: <.

Menserialisasikan jenis data xml yang ditik

Instans jenis data xml yang diketik berisi nilai yang diketik sesuai dengan jenis skema XML mereka. Nilai-nilai ini diserialisasikan sesuai dengan jenis skema XML mereka dalam format yang sama dengan XQuery yang ditransmisikan ke xs:string menghasilkan. Untuk informasi selengkapnya, lihat Mengetik Aturan Casting di XQuery.

Misalnya, nilai xs:double 1.34e1 diserialisasikan ke 13,4 seperti yang ditunjukkan dalam contoh berikut:

declare @x xml
set @x =''
select CAST(@x.query('1.34e1') as nvarchar(50));

Ini mengembalikan nilai string 13,4.

Lihat juga