使用触发器在 SQL Server 中具有复杂条件的表上创建唯一的过滤索引

阿里安

请考虑以下代码:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章