2013-11-25 70 views
0

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

实施例:

此代码可以执行和存储过程将被创建。

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 
+2

它被称为延迟名称解析。这很烦人,尽管用户多年来要求这样的选择,但仍然无法强制SQL Server不这样做。 –

+0

有什么理由让SQL保持这个选项活着? – veljasije

+0

在创建时没有检查* temp *表存在的情况肯定是存在的,因为在执行过程之前在外部范围中创建这样的表并不罕见,但是我没有亲自遇到任何用例来到永久表。 –

回答

0

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

要更好地理解它,请尝试运行下面的脚本。

CREATE PROCEDURE HELLO 
AS 
BEGIN 

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

这不会给出任何错误,因为表中也不存在数据库。所以它不能检查该列的存在。