Вы можете использовать отфильтрованный, уникальный индекс:
create table [t](
[id] [int] NULL,
[date] [datetime] NULL,
[passport] [char](8) NULL,
[deleted] [int] NULL
)
create unique index unq_t_date_passport on t(date, passport)
where deleted = 0;
EDIT:
Если отфильтрованные индексы не работают в вашей версии SQL Server, вы можете проверить уровень совместимости . Он должен быть доступен всякий раз, когда совместимость установлена на 100 или выше. Вы можете проверить версию своего сервера и уровень совместимости, используя:
SELECT SERVERPROPERTY('ProductVersion');
SELECT name, compatibility_level FROM sys.databases;
Существует еще один метод, который будет работать, начиная с SQL Server 2005, при условии, что идентификатор является уникальным и неотрицательным. Он использует вычисляемый столбец, чтобы делать то же самое, что и отфильтрованный индекс:
alter table t
add column deleted_id (case when deleted = 0 then -1 else id end) persisted;
create unique index unq_t_passport_date_deleted_id on t(passport, date, deleted_id);