Sql server 创建/更改引用不存在的表或视图的过程
根据: 过程可以引用尚不存在的表。创造时 此时,只执行语法检查。程序未编译 直到第一次执行为止。只有在编译过程中 已解析过程中引用的所有对象。因此, 语法正确的过程,该过程引用的表不正确 可以成功创建exist;但是,该程序在以下位置失败: 如果引用的表不存在,则执行时间 我总是觉得参考表是经过检查的。例如,如果您在现有视图中引用了一个不正确的列,它会在编译时抱怨:Sql server 创建/更改引用不存在的表或视图的过程,sql-server,sql-server-2017,Sql Server,Sql Server 2017,根据: 过程可以引用尚不存在的表。创造时 此时,只执行语法检查。程序未编译 直到第一次执行为止。只有在编译过程中 已解析过程中引用的所有对象。因此, 语法正确的过程,该过程引用的表不正确 可以成功创建exist;但是,该程序在以下位置失败: 如果引用的表不存在,则执行时间 我总是觉得参考表是经过检查的。例如,如果您在现有视图中引用了一个不正确的列,它会在编译时抱怨: 那么这里发生了什么,为什么在过程中检查列而不是视图/表呢?文档引用的是,在创建存储过程时,未对其进行验证。以这批为例: 使用沙箱
那么这里发生了什么,为什么在过程中检查列而不是视图/表呢?文档引用的是,在创建存储过程时,未对其进行验证。以这批为例:
使用沙箱;
去
创建PROC dbo.MyProc@ID int作为
开始
挑选*
从dbo.MyTable
其中ID=@ID;
结束;
去
创建表dbo.MyTable(ID int,
SomeValue-varchar(20));
插入到dbo.MyTable中
值(1,'asdjka'),
(2,“asdkj”);
去
EXEC dbo.MyProc 1;
去
DROP TABLE dbo.MyTable;
DROP PROC dbo.MyProc;
请注意,我在dbo.MyTable
之前创建了视图
在创建时被选中
创建表dbo.MyTable(ID int,
SomeValue-varchar(20));
插入到dbo.MyTable中
值(1,'asdjka'),
(2,“asdkj”);
去
--失败
创建视图dbo.MyView作为
选择ID,
一些价值,
萨密特
来自dbo.MyTable;
去
--失败
创建视图dbo.MyOtherView作为
挑选*
来自dbo.MyOtherTable;
去
DROP TABLE dbo.MyTable;
取决于对象类型,取决于发出DDL语句时验证的内容和未验证的内容
编辑:OP的问题似乎是,如果对象确实存在,为什么会出现错误,但他们引用的列却不存在。对于exmaple,采用以下批次:
使用沙箱;
去
创建表dbo.MyTable(ID int,
SomeValue-varchar(20));
插入到dbo.MyTable中
值(1,'asdjka'),
(2,“asdkj”);
去
创建PROC dbo.MyProc@ID int作为
开始
选择ID,
一些价值,
另一个值
从dbo.MyTable
其中ID=@ID;
结束;
去
DROP TABLE dbo.MyTable;
去
DROP PROC dbo.MyProc;
去
此操作失败,因为列另一个值不存在。这实际上包含在您引用的文档中:
过程可以引用尚不存在的表。在创建时,只执行语法检查
它明确说明您可以引用不存在的表。它没有提到表/对象中没有列的对象或(更具体地说)列。引用确实存在的表将在创建时验证。a视图
不是存储过程,它们是完全不同的对象。你真的在使用SQLServer2005吗?这已经失去了近5年的支持,您应该立即查看升级路径。@Larnu抱歉,我已经更新了标签。SP正在使用其中的视图。谢谢,尽管我认为您有点误解了。我可以创建一个引用不存在的视图的过程。但是,如果该视图确实存在,它将告诉我(在编译时)我的列名不正确。如果引用的对象确实存在,则语法必须正确,@m.edmondson。不会检查该表是否存在,但如果存在,则需要引用有效列。如果您的视图
/表
定义一直在更改,这表明存在一个更大的潜在问题/更正我知道这正在发生,但为什么会发生?当然,要么总是在编译时检查,要么总是在执行时检查,而不是某种混合?您没有引用一个不存在的表,@m.edmondson,因此您引用的文档是不相关的,正如我在回答中的编辑中所指出的。您正在引用一个确实存在的表,并传递了一个无效的列名。一列一张表。这真是令人惊讶