5

我使用 SQL Server 2008 R2。在我的数据库中存在多索引视图和多视图,它们使用这些索引视图和提示NOEXPAND。当我通过 SSMS (Database\Tasks\Generate Script ...) 获取我的数据库脚本时,SSMS 产品脚本按以下顺序:

  1. 索引视图的脚本
  2. 使用上述索引视图的视图脚本
  3. 索引视图的聚集索引脚本。

当我运行创建的脚本时,SQL 服务器创建第一个没有聚集索引的索引视图,然后想要创建带有NOEXPAND提示的索引视图视图,这会导致引发错误。我做什么?

SSMS 错误:hint 'noexpand' on object ..(indexed view).. is invalid.

4

2 回答 2

12

脚本索引的默认值为 False。您需要将其更改为 true 才能将 包含在CREATE INDEX您的视图中。在管理工作室中:

  • 工具 > 选项
  • SQL Server 对象资源管理器
  • 脚本
  • 表和视图选项 > 脚本索引

将选项设置为 True,单击 OK,然后再次尝试生成脚本。

编辑

在默认安装中,上述设置是我唯一更改的内容。我生成了以下架构:

CREATE TABLE dbo.x(i INT);
GO
ALTER VIEW dbo.v_x
WITH SCHEMABINDING
AS
  SELECT i, c = COUNT_BIG(*)
    FROM dbo.x
    GROUP BY i;
GO
CREATE UNIQUE CLUSTERED INDEX i ON dbo.v_x(i);
GO
CREATE VIEW dbo.v_y
AS
  SELECT i,c FROM dbo.v_x WITH (NOEXPAND);
GO

我右键单击数据库,Tasks > Generate Scripts... 选择了两个视图和表,脚本化到一个新的查询窗口,这就是它产生的(SET为了简洁,我删除了所有选项,不是因为它们不是那里或不重要):

USE [foo]
GO
/****** Object:  Table [dbo].[x]    Script Date: 06/20/2012 08:03:59 ******/
CREATE TABLE [dbo].[x](
    [i] [int] NULL
) ON [PRIMARY]
GO
/****** Object:  View [dbo].[v_x]    Script Date: 06/20/2012 08:04:00 ******/
CREATE VIEW [dbo].[v_x]
WITH SCHEMABINDING
AS
  SELECT i, c = COUNT_BIG(*)
    FROM dbo.x
    GROUP BY i;
GO
CREATE UNIQUE CLUSTERED INDEX [i] ON [dbo].[v_x] 
(
    [i] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, 
  IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
  ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
/****** Object:  View [dbo].[v_y]    Script Date: 06/20/2012 08:04:00 ******/
CREATE VIEW [dbo].[v_y]
AS
  SELECT i,c FROM dbo.v_x WITH (NOEXPAND);
GO

当我将其更改USE [foo]为不同的数据库时,脚本执行得很好(显然事情的顺序是正确的)。

因此,要么您以不同的方式生成脚本,要么您使用了“错误时继续编写脚本”选项,而您的视图会阻止创建索引。

于 2012-06-17T16:09:19.103 回答
0

我搜索我的问题并找到解决此问题的方法。当您创建一个名为 view1 的简单视图,然后创建另一个名为 view2 的视图,然后在 view1 中使用 view2,然后将 view2 更改为索引视图时,就会出现此问题。要解决此问题,您必须重新创建 view1。

于 2012-07-04T10:22:51.117 回答