我正在尝试创建过滤的非聚集索引。在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?
答案 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-colon和I've been trying to get everyone on board for a long time。你看到上面有一个分号吗?没有。)