meh*_*tfi 5 sql sql-server sql-server-2008 sql-server-2008-r2
我使用SQL Server 2008 R2.在我的数据库中存在多索引视图和多视图,它们使用带有提示的这些索引视图NOEXPAND.当我通过SSMS(Database\Tasks\Generate Script ...)获取我的数据库脚本时,SSMS产品脚本按以下顺序:
当我运行创建的脚本时,SQL Server创建没有聚簇索引的第一个索引视图,然后想要使用NOEXPAND提示创建索引视图的视图,这会导致引发错误.我所做的?
SSMS错误: hint 'noexpand' on object ..(indexed view).. is invalid.
Aar*_*and 12
脚本索引的默认值为False.您需要将其更改为true才能包含CREATE INDEX您的视图.在Management Studio中:
将该选项设置为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
Run Code Online (Sandbox Code Playgroud)
我右键单击了数据库,任务>生成脚本...选择了两个视图和表,编写了一个新的查询窗口,这就是它生成的内容(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
Run Code Online (Sandbox Code Playgroud)
当我将其更改USE [foo]为另一个数据库时,脚本执行得很好(显然事情的顺序正确).
因此,无论是以不同方式生成脚本,还是使用"继续编写错误脚本"选项,您的视图都会阻止创建索引.
我搜索我的问题并找到解决此问题的方法。当您创建一个名为 view1 的简单视图,然后创建另一个名为 view2 的视图,然后在 view1 中使用 view2,然后将 view2 更改为索引视图时,就会出现此问题。为了解决这个问题,你必须重新创建view1。