Di SQL Server, Anda dapat menggunakan sp_special_columns
prosedur tersimpan sistem untuk mengidentifikasi pengidentifikasi unik untuk tabel. Secara khusus, ini mengembalikan kumpulan kolom optimal yang secara unik mengidentifikasi baris dalam tabel. Itu juga mengembalikan kolom yang diperbarui secara otomatis ketika nilai apa pun di baris diperbarui oleh suatu transaksi.
sp_special_columns
setara dengan SQLSpecialColumns di ODBC.
Jika tidak ada kolom yang dapat mengidentifikasi tabel secara unik, kumpulan hasil akan kosong.
Sintaks
Sintaksnya seperti ini:
sp_special_columns [ @table_name = ] 'table_name' [ , [ @table_owner = ] 'table_owner' ] [ , [ @qualifier = ] 'qualifier' ] [ , [ @col_type = ] 'col_type' ] [ , [ @scope = ] 'scope' ] [ , [ @nullable = ] 'nullable' ] [ , [ @ODBCVer = ] 'ODBCVer' ] [ ; ]
@table_name
argumen diperlukan. Yang lainnya adalah opsional. Lihat dokumentasi Microsoft untuk penjelasan mendetail tentang setiap argumen.
Contoh 1 – Kolom Kunci Utama
Berikut adalah contoh dasar terhadap tabel dengan kolom kunci utama yang disebut PersonId :
EXEC sp_special_columns Person;
Itu juga dapat dijalankan seperti ini:
EXEC sp_special_columns @table_name = 'Person';
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Dalam hal ini, kolom kunci utama dikembalikan. Saya tahu ini adalah kolom kunci utama, karena saya membuat tabel dengan kode berikut:
CREATE TABLE Person ( PersonId int primary key, PersonName varchar(500) );
Jadi tampaknya prosedur tersimpan memang mengembalikan kolom optimal yang secara unik mengidentifikasi tabel ini.
Contoh 2 – Kolom UNIK
Tabel dalam contoh ini tidak memiliki kunci utama, tetapi memiliki UNIQUE
kendala.
Berikut kode yang digunakan untuk membuat tabel:
CREATE TABLE Event ( EventId int UNIQUE, EventName varchar(500) );
Jadi sekarang mari kita jalankan sp_special_columns
terhadap tabel itu:
EXEC sp_special_columns Event;
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Dalam hal ini, kolom dengan UNIQUE
kendala dianggap sebagai pengidentifikasi unik yang optimal.
Namun, ini tidak berarti bahwa apa pun kolom dibatasi oleh UNIQUE
batasan akan secara otomatis memenuhi syarat sebagai pengidentifikasi unik. Hasilnya dapat bergantung pada bagaimana nilai nol diperlakukan.
Contoh 3 – Argumen @nullable
Anda dapat menggunakan @nullable
argumen untuk menentukan apakah kolom khusus dapat menerima nilai nol.
Di sini, saya menjalankan kode yang sama lagi, kecuali kali ini saya menggunakan @nullable = 'O'
.
EXEC sp_special_columns Event, @nullable = 'O';
Hasil:
(0 rows affected)
Ini dia menggunakan @nullable = 'U'
EXEC sp_special_columns Event, @nullable = 'U';
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
O
menentukan kolom khusus yang tidak mengizinkan nilai nol. U
menentukan kolom yang sebagian dapat dibatalkan. U
adalah nilai default.
Inilah yang terjadi jika saya membuat kolom sebagai NOT NULL
:
DROP TABLE Event; CREATE TABLE Event ( EventId int NOT NULL UNIQUE, EventName varchar(500) ); EXEC sp_special_columns Event, @nullable = 'U'; EXEC sp_special_columns Event, @nullable = 'O';
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ (1 row affected) +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ (1 row affected)
Kali ini keduanya O
dan U
menghasilkan hasil yang sama.
Jika Anda memiliki tabel dengan beberapa UNIQUE
kolom kendala, dan beberapa mengizinkan nilai nol sementara yang lain tidak, argumen ini dapat berdampak pada mana yang dianggap sebagai pengidentifikasi unik yang optimal. Lihat Contoh 7 di bagian bawah artikel ini untuk contoh dari apa yang saya maksud.
Contoh 4 – Kolom IDENTITAS
Tabel dalam contoh ini tidak memiliki kunci utama atau UNIQUE
kendala, tetapi memiliki IDENTITY
kolom.
Berikut kode yang digunakan untuk membuat tabel:
CREATE TABLE Product ( ProductId int IDENTITY, ProductName varchar(500) );
Jadi sekarang mari kita jalankan sp_special_columns
terhadap tabel itu:
EXEC sp_special_columns Product;
Hasil:
(0 rows affected)
Jadi sepertinya IDENTITY
tidak cukup untuk mengidentifikasi tabel ini secara unik.
Contoh 5 – Kunci Utama Multikolom
Ini satu dengan kunci utama multikolom. Dalam hal ini dua kolom digunakan untuk kunci utama.
Berikut kode yang digunakan untuk membuat tabel:
CREATE TABLE PersonProduct ( PersonId int, ProductId int, CONSTRAINT PK_PersonProduct PRIMARY KEY (PersonId, ProductId) );
Jadi sekarang mari kita jalankan sp_special_columns
terhadap tabel itu:
EXEC sp_special_columns PersonProduct;
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonId | 4 | int | 10 | 4 | 0 | 1 | | 1 | ProductId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Contoh 6 – Kunci Utama dan Batasan UNIK
Bagaimana jika ada kunci utama dan sebuah UNIQUE
kendala dalam tabel yang sama?
Mari kita cari tahu:
CREATE TABLE PersonEvent ( PersonEventId int UNIQUE, PersonId int, EventId int, CONSTRAINT PK_PersonEvent PRIMARY KEY (PersonId, EventId) );
Jalankan sp_special_columns
terhadap tabel itu:
EXEC sp_special_columns PersonEvent;
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonId | 4 | int | 10 | 4 | 0 | 1 | | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Kunci utama menang.
Bagaimana jika kita mengganti kunci utama dan UNIQUE
kolom kunci di sekitar?
Oke, mari kita buat seluruh tabel lain hanya untuk itu:
CREATE TABLE PersonEvent2 ( PersonEventId int PRIMARY KEY, PersonId int UNIQUE, EventId int UNIQUE );
Jalankan sp_special_columns
terhadap tabel itu:
EXEC sp_special_columns PersonEvent2;
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | PersonEventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Jadi kunci utama menang lagi.
Contoh 7 – Banyak Kendala UNIK
Bagaimana jika setiap kolom memiliki UNIQUE
kendala?
CREATE TABLE Event2 ( EventId int UNIQUE, EventName varchar(500) UNIQUE, StartDate date UNIQUE, EndDate date UNIQUE );
Jalankan sp_special_columns
terhadap tabel itu:
EXEC sp_special_columns Event2;
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EndDate | -9 | date | 10 | 20 | NULL | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Tapi mari kita lihat apa yang terjadi jika kita menyetel salah satu kolom tersebut ke NOT NULL
, lalu gunakan @nullable = 'O'
:
DROP TABLE Event2; CREATE TABLE Event2 ( EventId int NOT NULL UNIQUE, EventName varchar(500) UNIQUE, StartDate date UNIQUE, EndDate date UNIQUE );
Jalankan sp_special_columns
dengan @nullable = 'O'
:
EXEC sp_special_columns Event2, @nullable = 'O';
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EventId | 4 | int | 10 | 4 | 0 | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Jadi kolom “not nullable” sekarang dipilih sebagai pengidentifikasi unik yang optimal.
Sekarang mari kita jalankan sp_special_columns
dengan @nullable = 'U'
:
EXEC sp_special_columns Event2, @nullable = 'U';
Hasil:
+---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+ | SCOPE | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | PSEUDO_COLUMN | |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------| | 1 | EndDate | -9 | date | 10 | 20 | NULL | 1 | +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
Sekarang kembali ke kolom sebelumnya.