Sql 存储过程错误:外键引用无效表

Sql 存储过程错误:外键引用无效表,sql,sql-server,Sql,Sql Server,错误消息: Msg 1767,16级,状态0,程序spCreateOrder,第4行[批处理起始行25] 外键“FK_PersonOrder”引用了无效的表“Persons” 正如大家在评论中所说,不建议在存储过程中创建表 但是要回答这个问题,您得到的错误是没有Persons表。这意味着您必须先创建订单表,然后再创建人员表。因此,您必须在spCreateCustomer之前执行spCreateOrder 如果在输入时执行脚本,则不会出现错误,因为表的创建顺序正确。您必须在其他地方以不同的顺序执行

错误消息:

Msg 1767,16级,状态0,程序spCreateOrder,第4行[批处理起始行25]
外键“FK_PersonOrder”引用了无效的表“Persons”


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

但是要回答这个问题,您得到的错误是没有
Persons
表。这意味着您必须先创建
订单
表,然后再创建
人员
表。因此,您必须在
spCreateCustomer
之前执行
spCreateOrder


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

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

但是要回答这个问题,您得到的错误是没有
Persons
表。这意味着您必须先创建
订单
表,然后再创建
人员
表。因此,您必须在
spCreateCustomer
之前执行
spCreateOrder


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

我认为这个代码应该有效(因为每个块之间都有
GO
s)。但是,我不建议将CREATETABLE语句放在存储过程中,除非您正在开发一个数据库结构将跨多个站点复制的应用程序。而且,即使在这种情况下,我也会建议使用某种模板数据库。感谢Gordon的回复,我正在使用asp.net MVC开发一个web应用程序,并且不使用
sp
前缀,它是由@Sami
sp
女士保留的。正是
sp
可能导致性能问题和与系统存储过程的意外冲突。但是,我仍然会避免使用
sp
,因为它很容易导致坏习惯,并且很容易在无意中被更改为
sp
。您问题中的代码不会导致错误(来自SSMS),因此看起来实际代码不同,或者您执行的代码不同。也就是说,我同意@marc_的观点,即在asp.net运行的进程中创建表没有多大意义。我认为这段代码应该可以工作(因为每个块之间都有
GO
s)。但是,我不建议将CREATETABLE语句放在存储过程中,除非您正在开发一个数据库结构将跨多个站点复制的应用程序。而且,即使在这种情况下,我也会建议使用某种模板数据库。感谢Gordon的回复,我正在使用asp.net MVC开发一个web应用程序,并且不使用
sp
前缀,它是由@Sami
sp
女士保留的。正是
sp
可能导致性能问题和与系统存储过程的意外冲突。但是,我仍然会避免使用
sp
,因为它很容易导致坏习惯,并且很容易在无意中被更改为
sp
。您问题中的代码不会导致错误(来自SSMS),因此看起来实际代码不同,或者您执行的代码不同。也就是说,我同意@marc_的观点,即在asp.net运行的进程中创建表没有多大意义。因此,我应该创建表,然后使用存储过程将值插入其中。@P.Coker。在数据库中创建所需的表。然后编写存储过程来获取、插入、更新和/或删除数据。然后从代码中调用相应的存储过程与数据库中的数据进行交互。因此,我应该创建一个表,然后使用一个存储过程将值插入其中。@P.Coker。在数据库中创建所需的表。然后编写存储过程来获取、插入、更新和/或删除数据。然后从代码中调用适当的存储过程,与数据库中的数据进行交互。
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