微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决创建/更改过程引用了不存在的表或视图

根据MSDN

一个过程可以引用尚不存在的表。创作时 时间,仅执行语法检查。该程序未编译 直到第一次执行。仅在编译期间 解决过程中引用的所有对象。因此, 语法正确的过程引用了不 存在可以成功创建;但是,该过程在 如果引用的表不存在,则执行时间。

我总是对引用的表 感到印象深刻。例如,如果您在现有视图中引用了不正确的列,则会在编译时抱怨

enter image description here

那么这是怎么回事,为什么要在过程中检查列而不检查视图/表?

解决方法

该文档引用的是,在创建存储过程时,该文档尚未经过验证。进行此批次:

USE Sandbox;
GO


CREATE PROC dbo.MyProc @ID int AS
BEGIN

    SELECT *
    FROM dbo.MyTable 
    WHERE ID = @ID;
END;

GO

CREATE TABLE dbo.MyTable (ID int,SomeValue varchar(20));
INSERT INTO dbo.MyTable
VALUES(1,'asdjka'),(2,'asdkj');
GO

EXEC dbo.MyProc 1;
GO

DROP TABLE dbo.MyTable;
DROP PROC dbo.MyProc;

请注意,我CREATE dbo.MyProc 之前 dbo.MyTable,即使它引用了该对象。这是因为在创建或更改过程时并未检查过程中对象的有效性。

另一方面,VIEW在创建时会被检查。

CREATE TABLE dbo.MyTable (ID int,'asdkj');

GO
--Fails
CREATE VIEW dbo.MyView AS

    SELECT ID,SomeValue,SomeInt
    FROM dbo.MyTable;
GO
--Fails
CREATE VIEW dbo.MyOtherView AS

    SELECT *
    FROM dbo.MyOtherTable;
GO

DROP TABLE dbo.MyTable;

取决于对象类型取决于发出DDL语句时验证的内容和无效的内容。


编辑:似乎OP质疑的是,如果对象确实存在,为什么会得到一个错误,但是他们引用了不存在的列。例如,请进行以下批处理:

USE Sandbox;
GO

CREATE TABLE dbo.MyTable (ID int,'asdkj');
GO

CREATE PROC dbo.MyProc @ID int AS
BEGIN

    SELECT ID,AnotherValue
    FROM dbo.MyTable 
    WHERE ID = @ID;
END;
GO

DROP TABLE dbo.MyTable;
GO
DROP PROC dbo.MyProc;
GO

这失败,因为列AnotherValue不存在。实际上,这在您引用的文档中已经涵盖:

一个过程可以引用尚不存在的表。在创建时,仅执行语法检查。

它明确指出您可以引用一个不存在的。它没有提及不存在的对象,也没有提及表/对象中的列。引用确实存在的表在创建时进行验证。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。