Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 创建/更改引用不存在的表或视图的过程_Sql Server_Sql Server 2017 - Fatal编程技术网

Sql server 创建/更改引用不存在的表或视图的过程

Sql server 创建/更改引用不存在的表或视图的过程,sql-server,sql-server-2017,Sql Server,Sql Server 2017,根据: 过程可以引用尚不存在的表。创造时 此时,只执行语法检查。程序未编译 直到第一次执行为止。只有在编译过程中 已解析过程中引用的所有对象。因此, 语法正确的过程,该过程引用的表不正确 可以成功创建exist;但是,该程序在以下位置失败: 如果引用的表不存在,则执行时间 我总是觉得参考表是经过检查的。例如,如果您在现有视图中引用了一个不正确的列,它会在编译时抱怨: 那么这里发生了什么,为什么在过程中检查列而不是视图/表呢?文档引用的是,在创建存储过程时,未对其进行验证。以这批为例: 使用沙箱

根据:

过程可以引用尚不存在的表。创造时 此时,只执行语法检查。程序未编译 直到第一次执行为止。只有在编译过程中 已解析过程中引用的所有对象。因此, 语法正确的过程,该过程引用的表不正确 可以成功创建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,因此您引用的文档是不相关的,正如我在回答中的编辑中所指出的。您正在引用一个确实存在的表,并传递了一个无效的列名。一列一张表。这真是令人惊讶