4

我正在尝试创建一个过滤的非聚集索引。在 gui 中,我右键单击Indexes我想要索引的表的文件夹。添加应应用索引的列,然后单击过滤器页面添加此语句:WHERE eMail IS NOT NULL。单击“确定”,出现此错误:

索引“fix_Email”的创建失败。(Microsoft.SqlServer.Smo)
关键字“WHERE”附近的语法不正确。
关键字“with”附近的语法不正确。如果此语句是公用表表达式、xmlnamespaces 子句或更改跟踪上下文子句,则前面的语句必须以分号结束。(Microsoft SQL Server,错误:156)

这直接来自一本关于 SQL Server 2008 管理的书。我安装了 SQL 2012 express 来看看两者之间会有什么不同。之前的所有示例都有效,创建了聚集索引、非聚集索引和覆盖索引。这是本书或 SQL Server 2012 或 Express 版的问题吗?我尝试按照我的陈述末尾的错误消息的建议放置一个分号WHERE,但这并没有做任何事情。

我能够在查询窗口中使用此代码创建索引:

CREATE NONCLUSTERED INDEX fix_Prices
ON dbo.Customers (eMail)
WHERE eMail IS NOT NULL;

为什么这行得通但不使用 Management Studio gui?

4

1 回答 1

5

当您在对话框中输入过滤器表达式时,您不需要WHERE自己添加子句。只需输入:

eMail IS NOT NULL

否则,如果您以 a开头WHERE,您将有两个WHERE子句(并且不要在末尾添加分号,因为它会中断索引创建语句的其余部分)。当您添加列、输入过滤条件并单击Script按钮时,您可以看到这一点。选择新的查询窗口。你会看到这样的东西:

USE [yourdb]
GO
SET ANSI_PADDING ON
GO
CREATE NONCLUSTERED INDEX [fix_Prices] ON [dbo].[Customers]
(
[eMail] ASC
)
WHERE WHERE eMail IS NOT NULL
------^^^^^ OOPS!

WITH (...index options...)
GO

可以说,SSMS 应该足够聪明,可以去除多余的WHERE子句,或者甚至可以使用 IntelliSense 向您展示您的脚本的外观,并轻松指出此类简单错误,但坦率地说,它们有比这更重要的错误要修复。(我的意思是,来吧,在 2008 年,他们宣布弃用不以分号结尾的语句,一直在努力让每个人都参与进来很长一段时间。你看到上面有一个分号吗? 没有。)

于 2013-03-23T14:24:40.897 回答