为什么存储过程允许引用定义中不存在的表名?这不允许用于表列,只允许用于表。
示例:
您可以执行此代码,并将创建存储过程。
CREATE PROCEDURE dbo.Test
AS
BEGIN
SELECT * FROM dbo.NonExistingTable -- Table does not exist in database model
END
此代码将引发一个错误。
CREATE PROCEDURE dbo.Test
AS
BEGIN
SELECT * FROM dbo.ExistingTable -- Table does exist in database model
WHERE NonExistingColumn = 0 -- but column does not exists in table
END
这是因为表在数据库中物理存在。因此,当您尝试创建此过程时,它将尝试查看表架构中是否存在名为"NonExistingColumn"的列。
若要更深入地理解它,请尝试运行以下脚本。
CREATE PROCEDURE HELLO
AS
BEGIN
CREATE TABLE NONEXISTINGTABLE (TID INT)
SELECT * FROM NONEXISTINGTABLE WHERE NONEXISTINGCOLUMN='N'
END
这不会给出任何错误,因为DB中也不存在表。所以它无法检查该列是否存在。