【发布时间】:2013-11-25 08:11:29
【问题描述】:
为什么存储过程允许在定义中引用不存在的表名?这对于表格列是不允许的,仅适用于表格。
例子:
你可以执行这段代码,然后创建存储过程。
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
【问题讨论】:
-
这称为延迟名称解析。这很烦人,尽管用户多年来一直要求这样的选项,但仍然无法强制 SQL Server 不这样做。
-
SQL 是否有任何理由保持该选项有效?
-
肯定有一种情况是它在创建时不检查 temp 表是否存在,因为在执行过程之前希望在外部范围内创建这样的表并不罕见,但我个人还没有遇到任何关于永久表的用例。
-
几天前,我的一位朋友告诉我一个潜在的解决方案。那将是当您创建必须重新组织的模型时,如果您已链接 SP,则允许创建它们而不检查它们在模型中的存在可能更实际。稍后您一定会更正所有 SP 以使其正常工作。允许创建具有延迟名称解析的 SP 对我来说毫无意义
标签: sql stored-procedures sql-server-2012