Обратите внимание на этот код:
CREATE UNIQUE NONCLUSTERED INDEX [idx1]
ON dbo.Table1 ([Year] ASC,
[City] ASC,
[Region] ASC,
[Sequence] ASC)
WHERE [Region] IN (1, 20)
AND [City] NOT LIKE N'C_341%'
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Проблема в том, что создание отфильтрованного индекса со сложным условием невозможно. и я получаю эту ошибку:
Incorrect syntax near the keyword 'LIKE'
Есть ли способ создать уникальность этих столбцов в SQL Server (например, с помощью TRIGGER?
Спасибо





От документация:
Filtered indexes are defined on one table and only support simple comparison operators. If you need a filter expression that references multiple tables or has complex logic, you should create a view.
@Arian Как вы представляете, как сделать LIKE уникальным? Подумайте об этом на минутку.
Вы видите в моем индексе только один столбец? Просто посмотри на это на секунду
На основе документация оператор LIKE не поддерживается. Отметьте эту часть
[comparison] ::=
column_name [comparison_op] constant
[comparison_op] ::=
{ IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< }
В других ответах уже указывалось, что 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
Вместо того, чтобы выдавать ошибки, вы можете создать триггер ВМЕСТО. В этом случае триггер будет отвечать за фактическое сохранение данных в таблице. Вы можете решить вставить все строки, часть строк или ни одну из них, чтобы вызвать ошибку, или молча пропустить повторяющиеся значения и т. д.
Спасибо, но я ищу альтернативный способ имитировать эту функцию.