Membuat instans data XML

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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.

  • Menggunakan pernyataan SELECT dengan klausa FOR XML.

  • Menggunakan penugasan konstanta.

  • Menggunakan beban massal.

Ketik string cast dan instans biner

Anda dapat mengurai salah satu jenis data string SQL Server, seperti [n][var]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 Ditik 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 dua byte seperti UTF-16 atau UCS-2, pengurai XML akan memperlakukan nilai string sebagai dokumen atau fragmen XML yang dikodekan Unicode dua byte. Ini berarti bahwa dokumen XML perlu dikodekan dalam pengodean Unicode dua 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 dua byte.

Konten string varchar diperlakukan sebagai dokumen/fragmen XML yang dikodekan satu byte oleh pengurai XML. Karena string sumber varchar memiliki halaman kode yang terkait, pengurai akan 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 akan 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 akan 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 akan ditafsirkan sebagai UTF-8.

Jika pengodean dokumen XML tidak diketahui sebelumnya dan data diteruskan sebagai string atau data biner alih-alih data XML sebelum ditransmisikan ke XML, disarankan untuk 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 dianggap tidak signifikan jika terjadi di dalam urutan data karakter khusus spasi putih yang dibatasi oleh markup, seperti tag mulai atau akhir, dan tidak diberi izin. (Bagian CDATA 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 (Transact-SQL).

Secara default, pengurai XML membuang spasi putih yang tidak signifikan saat mengonversi data string ke XML jika salah satu hal 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;

Ini adalah hasilnya:

<root><child/></root>

Namun, Anda dapat mengubah perilaku ini. Untuk mempertahankan spasi kosong untuk instans DT xml, gunakan operator CONVERT 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 operator CONVERT dan parameter gayanya saat mengonversi data string ke instans DT xml, lihat CAST dan CONVERT (Transact-SQL).

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 hal 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 klausa FOR XML dalam pernyataan SELECT untuk mengembalikan hasil sebagai XML. Contohnya:

DECLARE @xmlDoc XML;
SET @xmlDoc = (SELECT Column1, Column2
               FROM   Table1, Table2
               WHERE  <some condition>
               FOR XML AUTO)
...;

Pernyataan SELECT mengembalikan fragmen XML tekstual yang kemudian diurai selama penugasan ke variabel jenis data xml .

Anda juga bisa menggunakan direktifTYPE dalam klausul FOR XML yang secara langsung mengembalikan hasil kueri FOR XML sebagai jenis xml:

DECLARE @xmlDoc XML;
SET @xmlDoc = (SELECT ProductModelID, Name
               FROM   Production.ProductModel
               WHERE  ProductModelID = 19
               FOR XML AUTO, TYPE);
SELECT @xmlDoc;

Ini adalah hasilnya:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

Dalam contoh berikut, hasil xml yang ditik dari kueri XML FOR disisipkan ke dalam kolom jenis 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 kueri FOR XML yang menggunakan direktif TYPE, atau di mana jenis data xml digunakan untuk mengembalikan XML dari kolom SQL, variabel, dan parameter output. 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. Ini sama dengan CAST tersirat 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 Ditik dengan XML Yang Tidak Ditiru.

Menggunakan beban massal

Fungsionalitas OPENROWSET (Transact-SQL) 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 dan Ekspor Massal Dokumen XML (SQL Server). Untuk informasi selengkapnya tentang memuat dokumen XML, lihat Memuat Data XML.

Di bagian ini

Artikel Deskripsi
Mengambil dan Mengkueri Data XML Menjelaskan bagian instans XML yang tidak dipertahankan saat disimpan dalam database.

Baca juga