sql - 索引 View 在没有索引的情况下编写脚本

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

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

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

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

SSMS 错误:对象上的提示“noexpand”..(索引 View ).. 无效。

最佳答案

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

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

将该选项设置为 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

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

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

关于sql - 索引 View 在没有索引的情况下编写脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11071140/

相关文章:

sql-server - 如何让 SQL Server 以 AM/PM 格式保存日期时间?

sql - 数据透视问题,SQL Server

sql - 在 Snowflake SQL 中通过按条件子聚合来创建列

MySQL:大表、慢查询和索引

sql - 递归查询计算父值

sql-server - SQL Server 2008 搜索问题是否影响 SharePoint 搜索?

sql - 没有反向的查询结果

sql - 获取 .BAT 文件或 SQLCMD 以提示用户输入

python - 通过数据库的另一个函数调用函数中的变量

mysql - 转置部分 SQL 结果以合并记录