Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Database SQL di Microsoft Fabric
Saat mentransmisikan jenis 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.
Pengkodean 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 kolasi target, kesalahan akan muncul.
Contohnya:
select CAST(CAST(N'<Δ/>' as XML) as VARCHAR(MAX))
Ini dapat mengakibatkan kesalahan, jika halaman kode pengurutan saat ini tidak dapat merepresentasikan karakter Unicode Δ, atau akan merepresentasikannya dalam pengkodean 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, node elemen dipetakan ke markup elemen, dan node teks dipetakan ke konten teks. Namun, keadaan di mana karakter diberi izin dan bagaimana nilai atom yang diketik diserialisasikan dijelaskan di bagian berikut.
Pemberian entitas karakter XML selama serialisasi
Setiap struktur XML berseri harus mampu direparasi. Oleh karena itu, beberapa karakter harus diserialisasikan dengan cara yang di-entitasi untuk mempertahankan kemampuan bolak-balik karakter melalui fase normalisasi dari pengurai XML. Namun, beberapa karakter harus diberi nama sehingga dokumen terbentuk dengan baik dan, oleh karena itu, dapat diurai. Berikut adalah aturan entitasi yang berlaku selama serialisasi:
Karakter &, <, dan > selalu diubah menjadi
&,<, dan>masing-masing, jika muncul di dalam nilai atribut atau konten elemen.Karena SQL Server menggunakan tanda kutip (U+0022) untuk mengapit nilai atribut, tanda kutip dalam nilai atribut diubah menjadi
".Pasangan surrogat diubah menjadi referensi karakter numerik tunggal, saat proses di server saja. Misalnya, pasangan pengganti U+D800 U+DF00 diwakili oleh referensi karakter numerik
𐌀.Untuk melindungi TAB (U+0009) dan linefeed (LF, U+000A) agar tidak dinormalisasi selama penguraian, karakter tersebut diubah menjadi referensi karakter numerik mereka, yaitu
	dan
masing-masing, di dalam nilai atribut.Untuk mencegah pengembalian pengangkutan (CR, U+000D) dinormalisasi selama penguraian, diubah menjadi referensi karakter numeriknya dalam bentuk

baik di dalam nilai atribut maupun konten elemen.Untuk melindungi simpul teks yang hanya berisi spasi kosong, salah satu karakter white-space, umumnya yang terakhir, diubah menjadi referensi karakter numeriknya. Dengan cara ini, penguraian 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 dapat menggunakan opsi CONVERT eksplisit 1 saat mentransmisikan dari xml ke string atau jenis biner. Misalnya, untuk menghindari entitisasi, Anda dapat melakukan hal berikut:
SELECT CONVERT(NVARCHAR(50), CONVERT(XML, '<a> </a>', 1), 1);
Metode kueri() (Tipe Data xml) menghasilkan instans jenis data xml . Oleh karena itu, setiap hasil dari metode query() yang diubah ke tipe string atau biner diwujudkan sesuai dengan aturan yang dijelaskan sebelumnya. Jika Anda ingin mendapatkan nilai string yang tidak diubah menjadi entitas, Anda harus menggunakan Metode value() (Jenis 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 yang dihasilkan XQuery cast ke xs:string. 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.