Bagikan melalui


Membuat instans data XML

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