请考虑以下错误消息。
消息 207 级别 16 状态 1 第 7 行
列名“FOO”无效。
由于我触发它的方式,我碰巧知道这是一个解析/编译时错误。
假设我正在运行一个不属于过程的长脚本,并且我收到了相同的错误消息。此错误消息中的内容告诉我错误是在解析/编译时而不是运行时发生的?
CREATE TABLE Department_History
(
DepartmentNumber INT
);
GO
ALTER TABLE Department_History ADD FOO INT;
-- This is fine and shows FOO.
SELECT * FROM Department_History;
-- When uncommented, this fails at parse time.
INSERT Department_History (DepartmentNumber, FOO) VALUES (4, 5), (6, 7), (8, 9);
该错误没有在解析时发生。如果您对代码选择运行解析 (Ctrl + F5),它将成功。
相反,问题出在“绑定”步骤中。
我将从 Paul White 的博客文章《查询优化器深入探究 - 第 1 部分》中借用此图
至于这个问题,我不相信SQL服务器(很容易)发现错误发生在哪一步。
我已经使用扩展事件捕获了错误的调用堆栈,然后使用SQLCallStackResolver来转换该错误
您可以看到,就在异常发生之前,它尝试了
BindTree
。