该文档引用的是,在创建存储过程时,它没有经过验证。拿下这批:
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,
SomeValue varchar(20));
INSERT INTO dbo.MyTable
VALUES(1,'asdjka'),
(2,'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,
SomeValue varchar(20));
INSERT INTO dbo.MyTable
VALUES(1,'asdjka'),
(2,'asdkj');
GO
CREATE PROC dbo.MyProc @ID int AS
BEGIN
SELECT ID,
SomeValue,
AnotherValue
FROM dbo.MyTable
WHERE ID = @ID;
END;
GO
DROP TABLE dbo.MyTable;
GO
DROP PROC dbo.MyProc;
GO
这会失败,因为 AnotherValue 列不存在。这实际上包含在您引用的文档中:
过程可以引用尚不存在的表。在创建时,只执行语法检查。
它明确指出您可以引用一个不存在的表。它没有提到没有的对象,或者(更具体地说)表/对象中的列。引用确实存在的表将在创建时进行验证。