Adicione uma coluna computada persistente que combine as 18 teclas e crie um índice exclusivo na coluna computada:
alter table t add all_keys as c1+c2+c3+...+c18 persisted;
create unique index i18 on t (all_keys);
Consulte Criando índices em colunas computadas .
Outra abordagem é criar uma exibição indexada:
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);
Consulte Criando vistas indexadas .
Ambas as abordagens permitem um agregado de chave parcial: agregado c1 + c2 + c3 como k1, c4 + c5 + c6 como k2 etc., em seguida, indexa / cria uma exibição indexada em (k1, k2, ...). Tia pode ser benéfico para varreduras de intervalo (o índice pode ser usado para pesquisa em c1 + c2 + c3.
Obviamente, todas as +
operações no meu exemplo são agregação de cadeias, o operador real a ser usado depende dos tipos de todas essas colunas (por exemplo, você pode precisar usar projeções explícitas).
PS. Como restrições exclusivas são impostas por um índice exclusivo, qualquer restrição em índices exclusivos também se aplica a restrições exclusivas:
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.
No entanto, a criação da restrição em uma coluna computada persistente funciona:
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
Obviamente, a coluna persistente consome o espaço no disco, portanto a abordagem pode ser ruim para uma tabela muito grande. A abordagem de exibição indexada não apresenta esse problema, apenas consome o espaço para o índice , não o espaço para a coluna e o índice calculados .