创建在SQL Server 2012 Express中不起作用的筛选索引

Cra*_*ith 4 sql sql-server sql-server-2012-express

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

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

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

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

CREATE NONCLUSTERED INDEX fix_Prices
ON dbo.Customers (eMail)
WHERE eMail IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

为什么这样做但不使用Management Studio gui?

Aar*_*and 5

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

eMail IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

否则,如果你带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
Run Code Online (Sandbox Code Playgroud)

可以说,SSMS应该足够智能去除冗余WHERE条款,或者甚至可能会向你展示使用IntelliSense你的脚本会是什么样的,并且很容易指出像这样的简单错误,但坦率地说,他们有更重要的错误要解决.(我的意思是,来吧,在2008年,他们宣布不与分号结束语句的弃用,而我一直在试图让大家在船上很长时间.你看到上面的一个分号? 不.)