索引视图必须启用 WITH SCHEMABINDING,且基表名需两段式;禁止 SELECT *、子查询、非确定性函数;所有 SET 选项(如 ANSI_NULLS、ARITHABORT 等)必须严格匹配;首个索引须为唯一聚集索引;基表自身也需满足相同 SET 要求。

索引视图必须启用 WITH SCHEMABINDING
不加 WITH SCHEMABINDING 就无法创建索引视图,这是最基础的硬性门槛。它强制视图绑定到基表的架构,防止被引用的列被删改或重命名,否则索引会失效甚至导致查询报错。
常见错误现象:Cannot create index on view 'v_sales_summary' because the view is not schema-bound.
- 创建视图时必须显式写上
WITH SCHEMABINDING,不能省略 - 所有被引用的基表名必须带两段式名称(如
dbo.orders),不能用单段名(如orders) - 视图中不能包含
SELECT *、子查询、聚合函数(AVG、COUNT(*)等)、TOP、ROW_NUMBER()等非确定性表达式
SET 选项必须全部满足固定值
索引视图对会话级 SET 选项极其敏感。只要有一个不匹配,创建索引就会失败,或者后续查询根本不会使用该索引(即使建成功了)。
关键要求包括:
-
ANSI_NULLS必须为ON -
QUOTED_IDENTIFIER必须为ON -
ARITHABORT必须为ON(尤其注意:SSMS 默认是OFF,直接执行建索引语句常因此失败) -
CONCAT_NULL_YIELDS_NULL必须为ON -
NUMERIC_ROUNDABORT必须为OFF -
ANSI_WARNINGS必须为ON
验证方式:SELECT SESSIONPROPERTY('ARITHABORT') 返回 1 表示已启用;若为 0,需先执行 SET ARITHABORT ON 再操作。
第一个索引必须是唯一聚集索引
这是索引视图的“启动钥匙”——没有它,视图不会物化存储,优化器也不会考虑自动匹配。一旦建好唯一聚集索引,视图才真正变成一张“物理存在”的结果集。
- 聚集索引键必须是
UNIQUE的,且不能含NULL值(可用ISNULL(col, -1)等方式处理) - 索引键列必须全部来自视图的
SELECT列表,不能是计算列(除非是确定性且精确的,如col + 1) - 不能在视图上先建非聚集索引,再建聚集索引;顺序反了会报错
Cannot create index on view because it does not have a unique clustered index.
基表的 SET 选项也要一致
很多人只记得改当前会话的 SET,却忽略了被引用的基表本身创建时是否满足相同约束。如果某张表是用 ANSI_NULLS OFF 创建的,哪怕视图加了 SCHEMABINDING,也无法在其上建索引。
检查方法:SELECT name, uses_ansi_nulls FROM sys.tables WHERE name = 'orders';返回 0 表示不满足。
- 修复方式不是 ALTER TABLE,而是重建表(导出数据 → 删除原表 →
SET ANSI_NULLS ON后重建 → 导入) - 新建表务必在
SET ANSI_NULLS ON环境下执行,否则后患无穷 - SQL Server Management Studio 图形界面新建表时默认关闭
ANSI_NULLS,这点极易被忽略

















