必须先用WITH SCHEMABINDING创建视图并确保ANSI_NULLS、ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER全为ON,再创建唯一聚集索引;否则报错Msg 1940或“视图未绑定到架构”。

必须先用 WITH SCHEMABINDING 创建视图,再在其上建唯一聚集索引,缺一不可;否则报错 Msg 1940, Level 16, State 1 或 Cannot create index on view 'xxx' because the view is not schema bound。
创建前必须校验的 SET 选项
SQL Server 对索引视图的执行环境极其敏感。哪怕只差一个 ANSI_NULLS,后续建索引就会失败,且错误提示不直接指向 SET 问题。
-
ANSI_NULLS、ANSI_PADDING、ANSI_WARNINGS、ARITHABORT必须全为ON -
QUOTED_IDENTIFIER也必须是ON(虽然文档未列在“必需”表中,但实测缺失时CREATE VIEW会直接报错) - 这些设置需在 会话级 生效,不是数据库默认值就够了——SSMS 新建查询窗口默认是 ON,但某些 ORM 或旧客户端(如 DB-Library)可能默认 OFF
- 建议在脚本开头显式设置:
SET ANSI_NULLS ON<br>SET ANSI_PADDING ON<br>SET ANSI_WARNINGS ON<br>SET ARITHABORT ON<br>SET QUOTED_IDENTIFIER ON
视图定义必须满足确定性与两段式引用
架构绑定不是加个 WITH SCHEMABINDING 就完事。SQL Server 要求视图逻辑可预测、依赖明确。
- 所有引用对象(表、函数)必须带两段式名称,例如
dbo.Employees,不能只写Employees - 不能用非确定性函数:禁止
GETDATE()、NEWID()、@@ROWCOUNT、ISNULL()(注意:COALESCE()在多数场景下也被视为非确定性) - 不能有聚合(
GROUP BY)、DISTINCT、子查询(除非是相关子查询且满足严格条件)、外连接(LEFT/RIGHT JOIN允许,但FULL OUTER JOIN不允许) - 所有列名必须明确,不能用
*;若 SELECT 中有表达式(如FirstName + ' ' + LastName),需显式指定别名
建唯一聚集索引的硬性限制
索引视图真正起效的关键一步,但限制比普通表索引更严。
- 必须是
UNIQUE CLUSTERED,且键必须覆盖视图结果集的**全部行**——通常需包含基表的主键或唯一约束列 - 如果视图含多个表,唯一键必须能保证最终结果无重复(例如联接后仍能通过
Employees.EmployeeID唯一标识一行) - 不能对视图建非聚集索引,除非先建了唯一聚集索引
- 建索引语句本身不支持
ON [filegroup]之类选项,只能走默认文件组 - 示例关键片段:
CREATE VIEW dbo.vw_EmpDept<br>WITH SCHEMABINDING<br>AS<br>SELECT e.EmployeeID, e.FirstName, e.LastName, d.DepartmentName<br>FROM dbo.Employees AS e<br>INNER JOIN dbo.Departments AS d ON e.DepartmentID = d.DepartmentID;<br><br>CREATE UNIQUE CLUSTERED INDEX IX_vw_EmpDept_EmployeeID<br>ON dbo.vw_EmpDept (EmployeeID);
容易被忽略的权限与所有权陷阱
即使语法全对、SET 全开、索引也建成功,DML 操作仍可能失败——问题常出在元数据层面。
- 视图与所有基表必须属于同一 Schema(通常是
dbo),否则报错View or function 'xxx' is not schema bound - 创建者账号需对所有基表有
REFERENCES权限(不只是SELECT) - 若基表后来被
ALTER TABLE修改结构(如删列、改类型),哪怕只是加个NOT NULL,也会导致视图失效,且错误发生在 DML 阶段而非建索引时 - SQL Server 2022 Standard Edition 支持索引视图,但 Express 和 Web 版不支持——查
SELECT SERVERPROPERTY('Edition')确认

















