【问题标题】:Create filtered index not working in SQL Server 2012 Express创建筛选索引在 SQL Server 2012 Express 中不起作用
【发布时间】:2013-03-23 14:07:24
【问题描述】:

我正在尝试创建一个过滤的非聚集索引。在 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?

【问题讨论】:

  • 发布您正在尝试的确切代码。
  • 这是使用管理工作室的确切代码和方法,我正在对此进行更新,我能够使用直接 sql 语句创建它。
  • 嘿@marc_s,你为什么把错误信息改成斜体?我发现以这种格式阅读更难,而不是更容易。我想你会发现相反的情况?
  • @AaronBertrand:这正是我看到很多版主不久前使用的风格,我采用了它。不一定要那样 - 我只是想确保错误在问题的其余部分中明显突出
  • @marc_s 啊,好吧,你不必把它改回来,只是好奇你是否真的发现它更容易阅读。至于脱颖而出,在移动设备上它仍然是白色背景,但在桌面上它是像代码一样的颜色,但没有固定宽度的字体。

标签: sql sql-server sql-server-2012-express


【解决方案1】:

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

eMail IS NOT NULL

否则,如果您以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 向您展示您的脚本的外观并轻松指出此类简单错误,但坦率地说,它们有更重要的错误比这个要修复。 (我的意思是,来吧,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。你看到上面有一个分号吗?没有。)

【讨论】:

  • 是的,如果sql.StartsWith("where "),它应该只是提醒。
  • 酷,书中有错误。我查看了在 gui 中使用 sql 创建的索引,发现 ([eMail] IS NOT NULL) 在过滤器页面中。谢谢
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多