请考虑以下代码:
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]
问题是,似乎不可能创建具有复杂条件的过滤索引。我收到这个错误:
关键字“LIKE”附近的语法不正确
有没有办法在 SQL Server 中的这些列上创建唯一性(例如使用TRIGGER
?
谢谢
其他答案已经指出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
您可以创建INSTEAD OF触发器,而不是引发错误。在这种情况下,触发器将负责实际保存表中的数据。您可以决定插入所有行、部分行或不插入任何行、引发错误或静默跳过重复值等。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句