存储过程允许定义中不存在的表的名称



为什么存储过程允许引用定义中不存在的表名?这不允许用于表列,只允许用于表。

示例:

您可以执行此代码,并将创建存储过程。

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中也不存在表。所以它无法检查该列是否存在。

最新更新