Tambahkan kolom yang dihitung terus - menerus yang menggabungkan 18 kunci, lalu buat indeks unik pada kolom yang dihitung:
alter table t add all_keys as c1+c2+c3+...+c18 persisted;
create unique index i18 on t (all_keys);
Lihat Membuat Indeks pada Kolom yang Dihitung .
Pendekatan lain adalah membuat tampilan yang diindeks:
create view v
with schemabinding
as select c1+c2+c3+...+c18 as all_keys
from dbo.t;
create unique clustered index c18 on v(all_keys);
Lihat Membuat Tampilan Terindeks .
Kedua pendekatan memungkinkan untuk agregat kunci parsial: agregat c1 + c2 + c3 sebagai k1, c4 + c5 + c6 sebagai k2 dll. Kemudian indeks / buat tampilan yang diindeks pada (k1, k2, ...). Thia dapat bermanfaat untuk pemindaian rentang (indeks dapat digunakan untuk pencarian di c1 + c2 + c3.
Tentu saja, semua +
operasi dalam contoh saya adalah agregasi string, operator yang sebenarnya untuk digunakan tergantung pada jenis semua kolom tersebut (mis. Anda mungkin harus menggunakan gips eksplisit).
PS. Karena kendala unik ditegakkan oleh indeks unik, segala pembatasan pada indeks unik akan berlaku untuk kendala unik juga:
create table t (
c1 char(3), c2 char(3), c3 char(3), c4 char(3),
c5 char(3), c6 char(3), c7 char(3), c8 char(3),
c9 char(3), c10 char(3), c11 char(3), c12 char(3),
c13 char(3), c14 char(3), c15 char(3), c16 char(3),
c17 char(3), c18 char(3), c19 char(3), c20 char(3),
constraint unq unique
(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18));
go
Msg 1904, Level 16, State 1, Line 3
The index '' on table 't' has 18 column names in index key list.
The maximum limit for index or statistics key column list is 16.
Msg 1750, Level 16, State 0, Line 3
Could not create constraint. See previous errors.
Namun, membuat batasan pada kolom yang dikomputasi tetap berfungsi:
create table t (
c1 char(3), c2 char(3), c3 char(3), c4 char(3),
c5 char(3), c6 char(3), c7 char(3), c8 char(3),
c9 char(3), c10 char(3), c11 char(3), c12 char(3),
c13 char(3), c14 char(3), c15 char(3), c16 char(3),
c17 char(3), c18 char(3), c19 char(3), c20 char(3),
all_c as
c1+c2+c3+c4+c5+c6+c7+c8+c9+c10+c11+
c12+c13+c14+c15+c16+c17+c18
persisted
constraint unq unique (all_c));
go
Jelas, kolom yang bertahan mengkonsumsi ruang pada disk sehingga pendekatannya mungkin buruk untuk tabel yang sangat besar. Pendekatan tampilan diindeks tidak memiliki masalah ini, itu hanya mengkonsumsi ruang untuk indeks , bukan ruang untuk kolom dan indeks dihitung .