CREATE DOMAIN memungkinkan Anda membuat alias untuk tipe data bawaan dan menentukan rentang, batasan DEFAULT, NOT NULL, dan CHECK opsional
CREATE DOMAIN addr VARCHAR(90) NOT NULL DEFAULT 'N/A'; CREATE DOMAIN idx INT CHECK (VALUE > 100 AND VALUE < 999);Untuk detail dan contoh lebih lanjut, lihat MEMBUAT DOMAIN
Anda dapat menggunakan CREATE DOMAIN dan CREATE TYPE untuk membuat tipe pencacahan yang hanya dapat menerima nilai dari daftar yang ditentukan
CREATE DOMAIN color VARCHAR(10) CHECK (VALUE IN ('red', 'green', 'blue')); CREATE TYPE color2 AS ENUM ('red', 'green', 'blue');_Perhatikan bahwa nilai peka terhadap huruf besar-kecil
Saat CREATE TYPE digunakan, pengurutan dilakukan sesuai urutan nilai yang tercantum dalam pernyataan CREATE TYPE, bukan berdasarkan nilai sebenarnya
Ganti UDT skalar dengan tipe dasar. Tulis ulang prosedur tersimpan yang menggunakan parameter input tipe tabel untuk menggunakan string dengan CSV, XML, atau JSON, atau untuk memproses baris demi baris. Untuk informasi selengkapnya, lihat Prosedur Tersimpan
Penggunaan SQL Server
Tipe yang ditentukan pengguna SQL Server menyediakan mekanisme untuk mengenkapsulasi tipe data kustom dan untuk menambahkan batasan NULL
SQL Server juga mendukung tipe yang ditentukan pengguna dengan nilai tabel, yang dapat Anda gunakan untuk meneruskan sekumpulan nilai ke prosedur tersimpan
Jenis yang ditentukan pengguna juga dapat dikaitkan dengan rakitan kode CLR. Dimulai dengan SQL Server 2014, tipe yang dioptimalkan memori mendukung tabel dan kode yang dioptimalkan memori
Jika kode Anda menggunakan aturan khusus yang terikat pada tipe data, Microsoft menyarankan untuk menghentikan penggunaan fitur yang sudah tidak digunakan lagi ini
Semua tipe yang ditentukan pengguna didasarkan pada tipe data sistem yang ada. Mereka memungkinkan pengembang untuk menggunakan kembali definisi tersebut, membuat kode dan skema lebih mudah dibaca
Sintaksis
Sintaks yang disederhanakan untuk pernyataan CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);_7
CREATE TYPE { FROM [ NULL | NOT NULL ] | AS TABLE ()}Examples
User-defined types
Create a ZipCodeScalar user-defined type.
CREATE TYPE ZipCode FROM CHAR(5) NOT NULLGunakan CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);_8 dalam sebuah tabel
CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);Untuk contoh sebelumnya, pesan kesalahan berikut muncul. Ini menunjukkan bahwa nilai NULL untuk CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);9 tidak diperbolehkan
Msg 515, Level 16, State 2, Line 78 Cannot insert the value NULL into column 'ZipCode', table 'tempdb.dbo.UserLocations'; column doesn't allow nulls. INSERT fails. The statement has been terminated._Jenis bernilai tabel
Contoh berikut menunjukkan cara membuat dan menggunakan tipe nilai tabel untuk meneruskan sekumpulan nilai ke prosedur tersimpan
Buat tabel INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_0
CREATE TABLE OrderItems ( OrderID INT NOT NULL, Item VARCHAR(20) NOT NULL, Quantity SMALLINT NOT NULL, PRIMARY KEY(OrderID, Item) );Buat tabel tipe nilai untuk tabel INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);0
Buat prosedur INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_2. Perhatikan bahwa seluruh rangkaian baris dari parameter bernilai tabel ditangani dengan satu pernyataan
CREATE PROCEDURE InsertOrderItems @OrderItems AS OrderItems READONLY AS BEGIN INSERT INTO OrderItems(OrderID, Item, Quantity) SELECT OrderID, Item, Quantity FROM @OrderItems; ENDInstansiasi tipe INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);0, masukkan nilai, dan teruskan ke prosedur tersimpan
DECLARE @OrderItems AS OrderItems;INSERT INTO @OrderItems ([OrderID], [Item], [Quantity]) VALUES (1, 'M8 Bolt', 100), (1, 'M8 Nut', 100), (1, M8 Washer, 200); EXECUTE [InsertOrderItems] @OrderItems = @OrderItems; (3 rows affected)Pilih semua baris dari tabel INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_0
SELECT * FROM OrderItems; OrderID Item Quantity 1 M8 Bolt 100 1 M8 Nut 100 1 M8 Washer 200Untuk informasi selengkapnya, lihat CREATE TYPE (Transact-SQL) dalam dokumentasi SQL Server
Penggunaan MySQL
Amazon Aurora Edisi yang Kompatibel dengan MySQL (Aurora MySQL) 5. 7 tidak mendukung tipe yang ditentukan pengguna dan parameter bernilai tabel yang ditentukan pengguna
Dokumentasi saat ini tidak menunjukkan bahwa fitur ini akan didukung di Aurora MySQL versi 8
Pertimbangan Migrasi
Untuk tipe skalar yang ditentukan pengguna, ganti nama tipe dengan tipe dasar dan batasan NULL opsional
Untuk tipe yang ditentukan pengguna bernilai tabel yang digunakan sebagai parameter prosedur tersimpan, solusinya lebih rumit
Solusi umum termasuk menggunakan tabel sementara untuk menyimpan data atau meneruskan parameter string besar yang berisi data dalam CSV, XML, JSON (atau format nyaman lainnya) dan kemudian menulis kode untuk mengurai nilai-nilai ini dalam prosedur tersimpan. Alternatifnya, jika logika tidak memerlukan akses ke seluruh rangkaian perubahan, dan untuk kumpulan data kecil, lebih mudah untuk memanggil prosedur tersimpan dalam satu lingkaran dan meneruskan kolom sebagai parameter standar, baris demi baris
Mesin yang dioptimalkan untuk memori belum didukung di Aurora MySQL. Anda harus mengonversi tabel yang dioptimalkan memori ke tabel berbasis disk
Contoh
Mengganti tipe yang ditentukan pengguna
Ganti INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_5 tipe yang ditentukan pengguna dengan tipe dasar
CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);0Mengganti parameter stored procedure bernilai tabel
Langkah-langkah berikut menjelaskan cara mengganti parameter bernilai tabel dengan tabel sumber dan kursor INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);6
Buat tabel INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_0
CREATE TABLE OrderItems ( OrderID INT NOT NULL, Item VARCHAR(20) NOT NULL, Quantity SMALLINT NOT NULL, PRIMARY KEY(OrderID, Item) );Buat dan isi INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_8
CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);2CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);3Buat prosedur untuk mengulang melalui INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_8 dan menyisipkan baris
Ada perbedaan sintaksis dari T-SQL untuk deklarasi dan penggunaan Msg 515, Level 16, State 2, Line 78 Cannot insert the value NULL into column 'ZipCode', table 'tempdb.dbo.UserLocations'; column doesn't allow nulls. INSERT fails. The statement has been terminated.0 dan Msg 515, Level 16, State 2, Line 78 Cannot insert the value NULL into column 'ZipCode', table 'tempdb.dbo.UserLocations'; column doesn't allow nulls. INSERT fails. The statement has been terminated.1. Untuk informasi selengkapnya, lihat Prosedur Tersimpan dan Kursor
CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);_4Panggil prosedur tersimpan
CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);5Pilih semua baris dari tabel INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (1, '94324'); INSERT INTO [UserLocations] ([UserID],[ZipCode]) VALUES (2, NULL);_0
CREATE TABLE UserLocations (UserID INT NOT NULL PRIMARY KEY, ZipCode ZipCode);6Ringkasan
SQL Server Aurora MySQL CommentsParameter bernilai tabel
Tidak didukung
Gunakan tabel sementara, atau parameter string CSV, XML, JSON dan parsing datanya. Alternatifnya, tulis ulang stored procedure untuk menerima data satu baris pada satu waktu dan memproses data dalam satu lingkaran