在创建过滤索引时出现语法错误
Getting syntax error on Filtered index creation
我正在尝试添加这个索引:
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]
不幸的是,我收到此错误消息:
Msg 156, Level 15, State 1, Line 16
Incorrect syntax near the keyword 'or'.
这对我来说有点奇怪。我已经查阅了相关的 MSDN 页面,但我没有看到任何适合这里的约束。过滤器中的两列都存在于索引中。创建索引时,表达式中没有 OR。我在这里错过了什么?
过滤索引只允许 AND
和 IN
谓词,因此您的问题出在 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]
我正在尝试添加这个索引:
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]
不幸的是,我收到此错误消息:
Msg 156, Level 15, State 1, Line 16
Incorrect syntax near the keyword 'or'.
这对我来说有点奇怪。我已经查阅了相关的 MSDN 页面,但我没有看到任何适合这里的约束。过滤器中的两列都存在于索引中。创建索引时,表达式中没有 OR。我在这里错过了什么?
过滤索引只允许 AND
和 IN
谓词,因此您的问题出在 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]