索引视图在没有索引的情况下编写脚本

时间:2012-06-17 12:02:40

标签: sql sql-server sql-server-2008 sql-server-2008-r2

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

  1. 索引视图的脚本
  2. 使用上述索引视图的视图脚本
  3. 索引视图的聚簇索引脚本。
  4. 当我运行创建的脚本时,SQL Server创建没有聚簇索引的第一个索引视图,然后想要创建带有NOEXPAND提示的索引视图视图,这会导致出现错误。 我做了什么?

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

2 个答案:

答案 0 :(得分:12)

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

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

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

修改

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

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

我右键单击了数据库,任务>生成脚本...选择了两个视图和表,编写了一个新的查询窗口,这就是它生成的内容(为了简洁,我删除了所有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]更改为其他数据库时,脚本执行得很好(显然事情的顺序正确)。

因此,无论是以不同方式生成脚本,还是使用“继续编写错误脚本”选项,您的视图都会阻止创建索引。

答案 1 :(得分:0)

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