【问题标题】:Stored procedure error: foreign key references invalid table存储过程错误:外键引用无效表
【发布时间】:2018-12-08 15:28:28
【问题描述】:
CREATE PROCEDURE spCreateCustomer
AS
BEGIN
    CREATE TABLE Persons
    (
        PersonID INT NOT NULL PRIMARY KEY,
        LastName VARCHAR(255) NOT NULL,
        FirstName VARCHAR(255),
        Age INT
    );
END
GO

EXEC spCreateCustomer
GO

CREATE PROCEDURE spCreateOrder
AS
BEGIN
    CREATE TABLE Orders
    (
        OrderID INT NOT NULL PRIMARY KEY,
        OrderNumber INT NOT NULL,
        PersonID INT,
        CONSTRAINT FK_PersonOrder 
            FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
    ); 
END
GO
EXEC spCreateOrder
GO

错误信息:

消息 1767,级别 16,状态 0,过程 spCreateOrder,第 4 行 [批处理开始第 25 行]
外键“FK_PersonOrder”引用了无效表“Persons”

【问题讨论】:

  • 我认为这段代码应该可以工作(因为每个块之间都有GOs)。但是,我不建议将 create table 语句放在存储过程中,除非您正在开发一个数据库结构将跨多个站点复制的应用程序。而且,即使在这种情况下,我也会建议使用某种模板数据库。
  • 感谢 Gordon 的回复,我正在使用 asp.net Mvc 开发一个 Web 应用程序
  • 并且不要使用sp前缀,它是MS保留的。
  • @Sami sp 没问题。 sp_ 可能会导致性能问题以及与系统存储过程的意外冲突。不过,我还是会避免sp,因为它很容易导致坏习惯,很容易在无意中被改成sp_
  • 您问题中的代码不会导致错误(来自 SSMS),因此看起来实际代码不同或执行方式不同。也就是说,我同意@marc_s 的观点,即在从 asp.net 运行的 procs 中创建表没有多大意义。

标签: sql sql-server


【解决方案1】:

正如大家在 cmets 中所说,不建议在存储过程中创建表。

但要回答这个问题,您得到的错误是说没有Persons 表。这一定意味着您在创建Persons 表之前创建了Orders 表。所以你必须在spCreateCustomer之前执行spCreateOrder

如果脚本在您输入时执行,则不会出现错误,因为表的创建顺序正确。您必须在其他地方以不同的顺序执行语句。

【讨论】:

  • 所以我应该只创建表然后有一个用于将值插入其中的存储过程。
  • @P.Coker 没错。在数据库中创建您需要的表。然后编写存储过程来获取、插入、更新和/或删除数据。然后从代码中调用适当的存储过程来与数据库中的数据进行交互。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2017-03-24
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多