Ответ 1
Вы можете использовать отфильтрованный уникальный индекс:
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;
РЕДАКТИРОВАТЬ:
Если отфильтрованные индексы не работают над вашей версией 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);