Membuat variabel dan kolom tipe data XML

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Jenis data xml adalah jenis data bawaan di SQL Server dan agak mirip dengan jenis bawaan lainnya seperti int dan varchar. Seperti jenis bawaan lainnya, Anda dapat menggunakan tipe data xml sebagai jenis kolom saat membuat tabel sebagai jenis variabel, jenis parameter, jenis pengembalian fungsi, atau di CAST dan CONVERT.

Membuat kolom dan variabel

Untuk membuat xml kolom jenis sebagai bagian dari tabel, gunakan pernyataan, seperti yang CREATE TABLE diperlihatkan dalam contoh berikut:

CREATE TABLE T1(Col1 int primary key, Col2 xml);

Anda dapat menggunakan DECLARE statement untuk membuat variabel jenis xml , seperti yang ditunjukkan contoh berikut.

DECLARE @x xml;

Buat variabel yang diketik xml dengan menentukan koleksi skema XML, seperti yang diperlihatkan dalam contoh berikut.

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

Untuk meneruskan xml parameter jenis ke prosedur tersimpan, gunakan pernyataan, seperti yang CREATE PROCEDURE ditunjukkan dalam contoh berikut.

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ...

Anda dapat menggunakan XQuery untuk mengkueri instans XML yang disimpan dalam kolom, parameter, atau variabel. Anda juga dapat menggunakan Xml Data Manipulation Language (XML DML) untuk menerapkan pembaruan ke instans XML. Karena standar XQuery tidak menentukan XQuery DML pada saat pengembangan, SQL Server memperkenalkan ekstensi Bahasa Modifikasi Data XML ke XQuery. Ekstensi ini memungkinkan Anda melakukan operasi sisipkan, perbarui, dan hapus.

Menetapkan default

Dalam tabel, Anda bisa menetapkan instans XML default ke kolom jenis xml . Anda dapat menyediakan XML default dengan salah satu dari dua cara: dengan menggunakan konstanta XML, atau dengan menggunakan transmisi eksplisit ke jenis xml .

Untuk menyediakan XML default sebagai konstanta XML, gunakan sintaks seperti yang diperlihatkan dalam contoh berikut. String secara implisit CAST ke jenis xml .

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

Untuk menyediakan XML default sebagai eksplisit CAST ke xml, gunakan sintaks seperti yang ditunjukkan dalam contoh berikut.

CREATE TABLE T (XmlColumn xml
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server juga mendukung batasan NULL dan NOT NULL pada kolom jenis xml . Contohnya:

CREATE TABLE T (XmlColumn xml NOT NULL)

Tentukan batasan

Saat membuat kolom jenis xml , Anda bisa menentukan batasan tingkat kolom atau tingkat tabel. Gunakan batasan dalam situasi berikut:

  • Aturan bisnis Anda tidak dapat diekspresikan dalam skema XML. Misalnya, alamat pengiriman toko bunga harus berada dalam jarak 50 mil dari lokasi bisnisnya. Ini dapat ditulis sebagai batasan pada kolom XML. Batasan mungkin melibatkan metode jenis data xml .

  • Batasan Anda melibatkan kolom XML atau non-XML lainnya dalam tabel. Contohnya adalah penegakan ID Pelanggan (/Customer/@CustId) yang ditemukan dalam instans XML agar sesuai dengan nilai dalam kolom CustomerID relasional.

Anda dapat menentukan batasan untuk kolom tipe data xml yang diketik atau tidak diketik. Namun, Anda tidak dapat menggunakan metode jenis data XML saat menentukan batasan.

Tipe data xml tidak mendukung batasan kolom dan tabel berikut:

  • KUNCI PRIMER/KUNCI ASING

  • UNIQUE

  • COLLATE

    XML menyediakan pengodeannya sendiri. Kolabasi hanya berlaku untuk jenis string. Jenis data xml bukan jenis string. Namun, ia memang memiliki representasi string dan memungkinkan transmisi ke dan dari jenis data string.

  • ATURAN

Alternatif untuk menggunakan batasan adalah membuat pembungkus, fungsi yang ditentukan pengguna untuk membungkus metode jenis data xml dan menentukan fungsi yang ditentukan pengguna dalam batasan pemeriksaan seperti yang ditunjukkan dalam contoh berikut.

Dalam contoh berikut, batasan pada Col2 menentukan bahwa setiap instans XML yang disimpan dalam kolom ini harus memiliki <ProductDescription> elemen yang berisi ProductID atribut. Batasan ini diberlakukan oleh fungsi yang ditentukan pengguna ini:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN
RETURN @var.exist('/ProductDescription/@ProductID')
END;
GO

Metode exist() jenis data xml mengembalikan jika <ProductDescription> elemen dalam instans 1 berisi ProductID atribut . Jika tidak, ia kembali 0.

Sekarang, Anda dapat membuat tabel dengan batasan tingkat kolom sebagai berikut:

CREATE TABLE T (
    Col1 int primary key,
    Col2 xml check(dbo.my_udf(Col2) = 1));
GO

Penyisipan berikut berhasil:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />');

Karena batasan, penyisipan berikut gagal:

INSERT INTO T values(1,'<Product />');

Tabel yang sama atau berbeda

Kolom tipe data xml dapat dibuat dalam tabel yang berisi kolom relasional lainnya, atau dalam tabel terpisah dengan hubungan kunci asing ke tabel utama.

Buat kolom tipe data xml dalam tabel yang sama saat salah satu kondisi berikut ini benar:

  • Aplikasi Anda melakukan pengambilan data pada kolom XML dan tidak memerlukan indeks XML pada kolom XML.

  • Anda ingin membuat indeks XML pada kolom tipe data xml dan kunci utama tabel utama sama dengan kunci pengklusterannya. Untuk informasi selengkapnya, lihat Indeks XML (SQL Server).

Buat kolom tipe data xml dalam tabel terpisah jika kondisi berikut ini benar:

  • Anda ingin membuat indeks XML pada kolom tipe data xml , tetapi kunci utama tabel utama berbeda dari kunci pengklusterannya, atau tabel utama tidak memiliki kunci utama, atau tabel utama adalah timbunan (tanpa kunci pengklusteran). Ini mungkin benar jika tabel utama sudah ada.

  • Anda tidak ingin pemindaian tabel melambat karena adanya kolom XML dalam tabel. Ini menggunakan spasi apakah disimpan dalam baris atau di luar baris.