2012-06-17 38 views
3

我使用SQL Server 2008 R2。 在我的数据库存在多索引视图和多视图,使用这些索引视图与提示NOEXPAND。当我通过SSMS得到我的数据库的脚本(数据库\任务\生成脚本......),SSMS产品脚本通过以下命令:索引视图获取脚本没有索引

  1. 脚本索引视图的视图
  2. 脚本,利用上面的索引视图
  3. 索引视图的聚集索引脚本。

当我运行创建的脚本,SQL Server中创建第一个索引视图没有聚簇索引,那么要创建视图索引视图与NOEXPAND暗示,这导致引发错误。 我该怎么办?

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

回答

0

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

10

默认为脚本的索引是假。您需要将其更改为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]到不同的数据库,脚本执行就好了(显然事情是正确的顺序)。

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

+0

我测试这个方法。但SSMS会在创建所有视图的脚本之后创建索引视图的集群索引。如果一个索引视图在没有展开提示的另一个视图上使用,当运行创建的数据库脚本时,我们会面临错误,您不能使用noexpand提示。 –

+0

这就是整个脚本中的* only *错误?恐怕你将不得不张贴脚本和你用来获取它的方法。我无法复制(更新我的答案以反映这一点)。 –