【问题标题】:Stored procedures allow names of non-existing tables in definition存储过程允许定义中不存在的表的名称
【发布时间】: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


【解决方案1】:

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

要了解更多,请尝试运行以下脚本。

CREATE PROCEDURE HELLO
AS
BEGIN

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

这不会给出任何错误,因为数据库中也不存在表。因此它无法检查该列是否存在。

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多