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

时间:2013-11-25 08:11:29

标签: sql stored-procedures sql-server-2012

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

示例:

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

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

1 个答案:

答案 0 :(得分:0)

这是因为表在物理上存在于数据库中。因此,当您尝试创建此过程时,它将尝试查看表模式中是否存在名为“NonExistingColumn”的列。

要了解更多信息,请尝试在脚本下方运行。

CREATE PROCEDURE HELLO
AS
BEGIN

CREATE TABLE NONEXISTINGTABLE (TID INT)
SELECT * FROM NONEXISTINGTABLE WHERE NONEXISTINGCOLUMN='N'
END

这不会产生任何错误,因为DB中也不存在表。所以它无法检查该列是否存在。