能删,且无阻碍;加 WITH SCHEMABINDING 后则无法删除被引用表,并报明确错误。该选项要求两段式对象名、禁用 SELECT *、依赖函数也需绑定,且索引视图还需 ANSI_NULLS 和 QUOTED_IDENTIFIER 为 ON。

创建视图时没加 WITH SCHEMABINDING,表还能被删吗
能,而且删得毫无阻碍。SQL Server 默认不维护视图和基础表之间的强依赖关系——视图只是保存了一段 SELECT 语句,删掉它引用的表后,视图本身还在,但下次执行就会直接报错:Invalid object name 'dbo.Orders'。这不是延迟报错,是运行时崩,排查成本高。
WITH SCHEMABINDING 不是可选项,是硬性开关
加上 WITH SCHEMABINDING 后,SQL Server 就会把视图和它用到的所有对象(表、函数、其他视图)锁死在当前架构上。此时再执行 DROP TABLE dbo.Orders,会立刻失败,并返回明确错误:Cannot drop table 'Orders' because it is being referenced by object 'v_sales_summary'。
关键点在于:
- 必须显式写在
CREATE VIEW或ALTER VIEW语句里,SSMS 图形界面保存时会悄悄丢掉它,务必用脚本重写 - 所有被引用的对象名必须是两段式,比如
dbo.Customers,不能只写Customers - 视图定义中不能出现
SELECT *,必须列出具体字段名 - 如果视图里调用了用户函数,那个函数也得带
WITH SCHEMABINDING,否则绑定不成立
为什么加了 SCHEMABINDING 还报“名称无效”
典型错误信息:Cannot schema bind view 'vSales' because name 'Orders' is invalid for schema binding. Names must be in two-part format。这不是语法错误,是 SQL Server 的强制校验。
常见漏点:
- 忘了改 JOIN 子句里的表名,比如
JOIN Products没改成JOIN dbo.Products - 误用了跨库引用,
otherdb.dbo.Table在WITH SCHEMABINDING下完全不被允许 - 引用了临时表、表变量或系统视图(如
sys.columns),这些对象天生不支持架构绑定
索引视图必须用 SCHEMABINDING,且 SET 选项要对齐
想给视图建唯一聚集索引?第一步就是 WITH SCHEMABINDING,缺它直接报错:Cannot create index on view 'MyView' because the view is not schema bound。
但光有这个还不够。SQL Server 还会检查当前会话的 SET 状态:
-
ANSI_NULLS和QUOTED_IDENTIFIER必须为ON(建视图和建索引前都得确认) -
ARITHABORT在 OLE DB/ODBC 连接中也必须为ON;虽然ANSI_WARNINGS ON会隐式启用它,但显式写上更稳妥 - SSMS GUI 查询选项默认可能关着这些,光在脚本开头写
SET不一定生效,得进「查询选项」手动勾选
最易忽略的是:基表自己也得满足相同的 SET 要求,否则索引创建仍会失败。

















