Membuat instans data XML
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Artikel ini menjelaskan cara membuat instans XML.
Di SQL Server, Anda dapat menghasilkan instans XML dengan cara berikut:
- Ketik instans string transmisi.
SELECT
Menggunakan pernyataan denganFOR XML
klausul .- Menggunakan penugasan konstanta.
- Menggunakan beban massal.
Ketik string cast dan instans biner
Anda dapat mengurai salah satu jenis data string SQL Server, seperti [n]varchar, [n]char, [n]text, varbinary, dan image, ke dalam jenis data xml dengan mentransmisikan (CAST
) atau mengonversi (CONVERT
) string ke jenis data xml . XML yang tidak dititik diperiksa untuk mengonfirmasi bahwa XML terbentuk dengan baik. Jika ada skema yang terkait dengan jenis xml , validasi juga dilakukan. Untuk informasi selengkapnya, lihat Membandingkan XML yang di ketik dengan XML yang tidak ditiru.
Dokumen XML dapat dikodekan dengan pengodean yang berbeda (misalnya, UTF-8, UTF-16, Windows-1252). Berikut ini menguraikan aturan tentang bagaimana string dan jenis sumber biner berinteraksi dengan pengodean dokumen XML dan bagaimana pengurai bereaksi.
Karena nvarchar mengasumsikan pengodean Unicode 2-byte seperti UTF-16 atau UCS-2, pengurai XML memperlakukan nilai string sebagai dokumen atau fragmen XML yang dikodekan Unicode 2-byte. Dokumen XML perlu dikodekan dalam pengodean Unicode 2-byte juga agar kompatibel dengan jenis data sumber. Dokumen XML yang dikodekan UTF-16 dapat memiliki tanda urutan byte (BOM) UTF-16, tetapi tidak perlu, karena konteks jenis sumber membuatnya jelas bahwa itu hanya dapat menjadi dokumen yang dikodekan Unicode 2-byte.
Konten string varchar diperlakukan sebagai dokumen/fragmen XML yang dikodekan 1 byte oleh pengurai XML. Karena string sumber varchar memiliki halaman kode yang terkait, pengurai menggunakan halaman kode tersebut untuk pengodean jika tidak ada pengodean eksplisit yang ditentukan dalam XML itu sendiri. Jika instans XML memiliki BOM atau deklarasi pengodean, BOM atau deklarasi harus konsisten dengan halaman kode, jika tidak, pengurai melaporkan kesalahan.
Konten varbinary diperlakukan sebagai aliran codepoint yang diteruskan langsung ke pengurai XML. Dengan demikian, dokumen atau fragmen XML perlu menyediakan BOM atau informasi pengodean lainnya sebaris. Pengurai hanya melihat aliran untuk menentukan pengodean. Ini berarti bahwa XML yang dikodekan UTF-16 perlu menyediakan UTF-16 BOM, dan instans tanpa BOM dan tanpa pengodean deklarasi, ditafsirkan sebagai UTF-8.
Jika pengodean dokumen XML tidak diketahui sebelumnya dan data diteruskan sebagai string atau data biner alih-alih data XML sebelum transmisi ke XML, Anda harus memperlakukan data sebagai varbinary. Misalnya, saat membaca data dari file XML menggunakan OpenRowset()
, seseorang harus menentukan data yang akan dibaca sebagai nilai varbinary(maks):
SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);
SQL Server secara internal mewakili XML dalam representasi biner efisien yang menggunakan pengodean UTF-16. Pengodean yang disediakan pengguna tidak dipertahankan, tetapi dipertimbangkan selama proses penguraian.
Jenis jenis yang ditentukan pengguna CLR cast
Jika jenis yang ditentukan pengguna CLR memiliki Serialisasi XML, instans jenis tersebut dapat secara eksplisit ditransmisikan ke jenis data XML. Untuk informasi selengkapnya tentang serialisasi XML dari jenis yang ditentukan pengguna CLR, lihat Serialisasi XML dari Objek Database CLR.
Menangani spasi kosong dalam XML yang ditik
Di SQL Server, spasi kosong di dalam konten elemen diabaikan jika terjadi di dalam urutan data karakter khusus spasi putih yang dibatasi oleh markup, seperti tag mulai atau akhir, dan tidak diberi entitas. (CDATA
bagian diabaikan.) Penanganan ruang kosong ini berbeda dengan bagaimana ruang kosong dijelaskan dalam spesifikasi XML 1.0 yang diterbitkan oleh World Wide Web Consortium (W3C). Ini karena pengurai XML di SQL Server hanya mengenali jumlah subset DTD yang terbatas, seperti yang didefinisikan dalam XML 1.0. Untuk informasi selengkapnya tentang subset DTD terbatas yang didukung di SQL Server, lihat CAST dan CONVERT.
Secara default, pengurai XML membuang spasi kosong yang tidak signifikan saat mengonversi data string ke XML jika salah satu opsi berikut ini benar:
Atribut
xml:space
tidak didefinisikan pada elemen atau elemen leluhurnya.Atribut
xml:space
yang berlaku pada elemen, atau salah satu elemen leluhurnya, memiliki nilai default.
Contohnya:
DECLARE @x XML;
SET @x = '<root> <child/> </root>';
SELECT @x;
Berikut adalah hasil yang ditetapkan.
<root><child/></root>
Namun, Anda dapat mengubah perilaku ini. Untuk mempertahankan spasi kosong untuk instans xml DT, gunakan CONVERT
operator dan parameter gaya opsionalnya yang diatur ke nilai 1. Contohnya:
SELECT CONVERT(XML, N'<root> <child/> </root>', 1);
Jika parameter gaya tidak digunakan, atau nilainya diatur ke 0
, spasi kosong yang tidak signifikan tidak dipertahankan untuk konversi instans DT xml. Untuk informasi selengkapnya tentang cara menggunakan CONVERT
operator dan parameter gayanya saat mengonversi data string ke instans DT xml, lihat CAST dan CONVERT.
Contoh: Mentransmisikan nilai string ke XML yang diketik dan menetapkannya ke kolom
Contoh berikut mentransmisikan variabel string yang berisi fragmen XML ke jenis data xml lalu menyimpannya di kolom jenis xml :
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
GO
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
Operasi sisipkan berikut secara implisit mengonversi dari string ke jenis xml :
INSERT INTO T
VALUES (3, @s);
Anda dapat secara CAST
eksplisit string ke jenis xml :
INSERT INTO T
VALUES (3, CAST(@s AS XML));
Atau Anda dapat menggunakan CONVERT
, seperti yang ditunjukkan dalam sampel kode berikut:
INSERT INTO T
VALUES (3, CONVERT(XML, @s));
Contoh: Mengonversi string ke XML yang ditik dan menetapkannya ke variabel
Dalam contoh berikut, string dikonversi ke jenis xml dan ditetapkan ke variabel jenis data xml :
DECLARE @x XML;
DECLARE @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);
SELECT @x;
Menggunakan pernyataan SELECT dengan klausul FOR XML
Anda dapat menggunakan FOR XML
klausa dalam SELECT
pernyataan untuk mengembalikan hasil sebagai XML. Contohnya:
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT Column1, Column2
FROM Table1, Table2
WHERE <some_condition>
FOR XML AUTO
)
...;
Pernyataan mengembalikan SELECT
fragmen XML tekstual yang kemudian diurai selama penugasan ke variabel jenis data xml .
Anda juga bisa menggunakan direktif TYPE dalam kueri FOR XML dalam FOR XML
klausa FOR XML
yang langsung mengembalikan hasil kueri sebagai jenis xml :
DECLARE @xmlDoc XML;
SET @xmlDoc = (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT @xmlDoc;
Berikut adalah hasil yang ditetapkan.
<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...
Dalam contoh berikut, hasil xml yang ditik dari kueri disisipkan ke dalam kolom jenis xml:FOR XML
CREATE TABLE T1 (
c1 INT,
c2 XML
);
GO
INSERT T1 (c1, c2)
SELECT 1, (
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID = 19
FOR XML AUTO, TYPE
);
SELECT *
FROM T1;
GO
Untuk informasi selengkapnya tentang FOR XML
, lihat UNTUK XML (SQL Server).
Catatan
SQL Server mengembalikan instans jenis data xml ke klien sebagai hasil dari konstruksi server yang berbeda seperti FOR XML
kueri yang menggunakan TYPE
direktif, atau di mana jenis data xml digunakan untuk mengembalikan XML dari kolom, variabel, dan parameter Output Mesin Database SQL Server. Dalam kode aplikasi klien, penyedia ADO.NET meminta agar informasi jenis data xml ini dikirim dalam pengodean biner dari server. Namun, jika Anda menggunakan FOR XML
tanpa direktif TYPE
, data XML akan ditampilkan sebagai jenis string. Bagaimanapun, penyedia klien akan selalu dapat menangani salah satu bentuk XML.
Menggunakan penetapan konstanta
Konstanta string dapat digunakan di mana instans jenis data xml diharapkan. Penugasan ini sama dengan tersirat CAST
dari string ke XML. Contohnya:
DECLARE @xmlDoc XML;
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';
Contoh sebelumnya secara implisit mengonversi string ke jenis data xml dan menetapkannya ke variabel jenis xml .
Contoh berikut menyisipkan string konstanta ke dalam kolom jenis xml :
CREATE TABLE T (
c1 INT PRIMARY KEY,
c2 XML
);
INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');
Catatan
Untuk XML yang diketik, XML divalidasi terhadap skema yang ditentukan. Untuk informasi selengkapnya, lihat Membandingkan XML yang di ketik dengan XML yang tidak ditiru.
Menggunakan beban massal
Fungsionalitas OPENROWSET yang disempurnakan memungkinkan Anda memuat dokumen XML secara massal dalam database. Anda dapat memuat instans XML secara massal dari file ke dalam kolom jenis xml dalam database. Untuk sampel kerja, lihat Contoh impor massal dan ekspor dokumen XML (SQL Server). Untuk informasi selengkapnya tentang memuat dokumen XML, lihat Memuat data XML.
Di bagian ini
Artikel | Deskripsi |
---|---|
Opsi kueri XML dan data yang dipertahankan | Menjelaskan bagian instans XML yang tidak dipertahankan saat disimpan dalam database. |