【发布时间】: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