【问题标题】:Getting syntax error on Filtered index creation创建过滤索引时出现语法错误
【发布时间】:2019-09-28 08:41:26
【问题描述】:

我正在尝试添加此索引:

CREATE NONCLUSTERED INDEX [HE_MissingIndex] 
ON [dbo].[HardwareEvents] ([PlaceId] ASC, [EventId] ASC, [UserTokenType])
INCLUDE ([Id], [EventTime], [UserToken], [Username], [UserId],
         [VisitorId], [UserLastname]) 
WHERE (EventId = 16 AND UserTokenType = 5) OR EventId = 58
          WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, 
                ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

很遗憾,我收到以下错误消息:

消息 156,第 15 级,状态 1,第 16 行
关键字“或”附近的语法不正确。

这对我来说有点奇怪。我已经查阅了相关的 MSDN 页面,我没有看到任何适合这里的约束。过滤器中的两列都存在于索引中。创建索引时,表达式中没有 OR。我在这里错过了什么?

【问题讨论】:

  • @marc_s 真的吗?我不认为你的编辑让它更清楚......

标签: tsql sql-server-2014


【解决方案1】:

过滤索引只允许ANDIN 谓词,因此您的问题在于您的WHERE 子句——您不能使用OR。你可以通过创建两个索引来解决这个问题:

CREATE NONCLUSTERED INDEX [HE_MissingIndex] ON [dbo].[HardwareEvents]
(
    [PlaceId] ASC,
    [EventId] ASC,
    [UserTokenType] ASC
)
INCLUDE (   [Id],
    [EventTime],
    [UserToken],
    [Username],
    [UserId],
    [VisitorId],
    [UserLastname]) 
    WHERE [EventId] = 16 and [UserTokenType] = 5
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [HE_MissingIndex_2] ON [dbo].[HardwareEvents]
(
    [PlaceId] ASC,
    [EventId] ASC,
    [UserTokenType] ASC
)
INCLUDE (   [Id],
    [EventTime],
    [UserToken],
    [Username],
    [UserId],
    [VisitorId],
    [UserLastname]) 
    WHERE [EventId] = 58
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

【讨论】:

  • 这就是我的想法,但我没有找到任何我不能使用 OR 的记录约束。但我现在在语法中看到,只能使用连词。引擎会在同一个查询中使用两个索引吗?我不确定...
  • @ZorgoZ 我也没有找到任何官方文档,只有 SO 帖子和其他地方的几个 cmets。
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 2018-11-21
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多