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

时间:2013-03-23 14:07:24

标签: 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;

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

1 个答案:

答案 0 :(得分:5)

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

eMail IS NOT NULL

否则,如果您使用WHERE,则会有两个WHERE子句(并且最后不要添加分号,因为它会中断其余的索引创建声明)。添加列,输入过滤条件,然后单击脚本按钮后,可以看到此信息。选择新的查询窗口。你会看到这样的东西:

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的脚本会是什么样的,并且很容易指出这样的简单错误,但坦率地说他们有更多的错误重要的错误比修复。 (我的意思是,来吧,in 2008 they announced deprecation of statements that aren't terminated with a semi-colonI've been trying to get everyone on board for a long time。你看到上面有一个分号吗?没有。)