В других ответах уже указывалось, что LIKE
не поддерживается в отфильтрованных индексах.Поэтому я остановлюсь на альтернативном способе навязывания уникальности.Да, вы можете сделать это с помощью триггера.Вы должны определить после вставки и после обновления триггера.В нем вы должны проверить содержимое вашей таблицы, помня о том, что строки, вставленные с помощью этих операторов (их может быть несколько), уже есть.Если вы обнаружите дублированные значения, вы откатите транзакцию и выдадите ошибку.Код триггера может выглядеть следующим образом (при условии, что ID - это ваше поле первичного ключа, которое позволит нам идентифицировать вновь вставленные записи):
CREATE TRIGGER [FORCE_UNIQUENESS] on [dbo].[Table1]
INSTEAD OF INSERT, UPDATE
AS
BEGIN
if exists(select *
from dbo.Table1 t
inner join inserted i on
i.[Year] = t.[Year] and
i.[City] = t.[City] and
i.[Region] = t.[Region] and
i.[Sequance] = t.[Sequance] and
t.ID <> i.ID
where i.Region in (1, 20) and i.[City] NOT LIKE N'C_341%')
begin
ROLLBACK TRANSACTION
RAISERROR('Duplicated values detected', 16, 1);
end
END
Вместо появления ошибок вы можете создать INSTEADOF триггер.В этом случае триггер будет отвечать за фактическое сохранение данных в таблице.Вы можете решить вставлять все строки, часть строк или ни одну из них, чтобы вызвать ошибку или пропустить дублированные значения и т. Д.