Sql 存储过程错误:外键引用无效表
错误消息: Msg 1767,16级,状态0,程序spCreateOrder,第4行[批处理起始行25]Sql 存储过程错误:外键引用无效表,sql,sql-server,Sql,Sql Server,错误消息: Msg 1767,16级,状态0,程序spCreateOrder,第4行[批处理起始行25] 外键“FK_PersonOrder”引用了无效的表“Persons” 正如大家在评论中所说,不建议在存储过程中创建表 但是要回答这个问题,您得到的错误是没有Persons表。这意味着您必须先创建订单表,然后再创建人员表。因此,您必须在spCreateCustomer之前执行spCreateOrder 如果在输入时执行脚本,则不会出现错误,因为表的创建顺序正确。您必须在其他地方以不同的顺序执行
外键“FK_PersonOrder”引用了无效的表“Persons”
正如大家在评论中所说,不建议在存储过程中创建表 但是要回答这个问题,您得到的错误是没有
Persons
表。这意味着您必须先创建订单
表,然后再创建人员
表。因此,您必须在spCreateCustomer
之前执行spCreateOrder
如果在输入时执行脚本,则不会出现错误,因为表的创建顺序正确。您必须在其他地方以不同的顺序执行这些语句 正如大家在评论中所说,不建议在存储过程中创建表 但是要回答这个问题,您得到的错误是没有
Persons
表。这意味着您必须先创建订单
表,然后再创建人员
表。因此,您必须在spCreateCustomer
之前执行spCreateOrder
如果在输入时执行脚本,则不会出现错误,因为表的创建顺序正确。您必须在其他地方以不同的顺序执行这些语句 我认为这个代码应该有效(因为每个块之间都有
GO
s)。但是,我不建议将CREATETABLE语句放在存储过程中,除非您正在开发一个数据库结构将跨多个站点复制的应用程序。而且,即使在这种情况下,我也会建议使用某种模板数据库。感谢Gordon的回复,我正在使用asp.net MVC开发一个web应用程序,并且不使用sp
前缀,它是由@Samisp
女士保留的。正是sp
可能导致性能问题和与系统存储过程的意外冲突。但是,我仍然会避免使用sp
,因为它很容易导致坏习惯,并且很容易在无意中被更改为sp
。您问题中的代码不会导致错误(来自SSMS),因此看起来实际代码不同,或者您执行的代码不同。也就是说,我同意@marc_的观点,即在asp.net运行的进程中创建表没有多大意义。我认为这段代码应该可以工作(因为每个块之间都有GO
s)。但是,我不建议将CREATETABLE语句放在存储过程中,除非您正在开发一个数据库结构将跨多个站点复制的应用程序。而且,即使在这种情况下,我也会建议使用某种模板数据库。感谢Gordon的回复,我正在使用asp.net MVC开发一个web应用程序,并且不使用sp
前缀,它是由@Samisp
女士保留的。正是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