为人员/客户/员工关系创建SQL Server存储过程

dpiehjr4  于 2022-11-28  发布在  SQL Server
关注(0)|答案(1)|浏览(149)

我有三个SQL Server表。我试图创建一个存储过程,即Person表,我在其中存储人员信息,Customer表从人员表中获取信息,但它保存人员状态,工人数据表也是如此。
示例数据:
数据表:

Person                          Customer                     Worker
ID(BigInt)                      ID(BigInt)                   ID(BigInt)
FirstName(nvarchar(100))        PersonID(BigInt)             PersonID(BigInt)
MiddleNameS(nvarchar(100))      Status(nvarchar(100))        Status(nvarchar(100))
Surname(nvarchar(100))              
Phone(varchar(20))              
EMail(nvarchar(100))

存储程序:InsertCustomer具有人员的所有人员信息,当执行该程序时,它应获取人员信息并将其存储在Person表和Customer表中,需要保留customerIDpersonIDstatus

fnatzsnv

fnatzsnv1#

您将您的问题标记为TSQL,所以我假设这就是您想要的,尽管使用了无效的语法来描述表。
首先,让我们讨论一下如何提供演示数据和对象。这是一种简单的方法,任何人都可以复制和粘贴:

DECLARE @Person TABLE (ID BIGINT IDENTITY, FirstName NVARCHAR(100), MiddleNameS NVARCHAR(100), Surname NVARCHAR(100), Phone VARCHAR(20), EMail NVARCHAR(100));
DECLARE @Customer TABLE (ID BIGINT IDENTITY, PersonID BIGINT, Status NVARCHAR(100));
DECLARE @Worker TABLE (ID BIGINT IDENTITY, PersonID BIGINT, Status NVARCHAR(100));

您可以轻松地将演示数据插入到这些表中,但对于本例,我们不需要任何数据。
继续回答问题。上一条注解是正确的。根据您的描述,这应该是一个表,而不是三个表。CustomerStatus和WorkerStatus只是Person对象的属性。它们没有其他属性,不会多次存在。
这使得存储过程内容的正确答案类似于:

INSERT INTO @Person (FirstName, MiddleNameS, Surname, Phone, EMail, CustomerStatus, WorkerStatus) VALUES
(@FirstName, @MiddleNameS, @Surname, @Phone, @Email, @CustomerStatus, @WorkerStatus);

这只是将值(假设它们将被传递给存储过程)插入到表中。
如果您坚持要使用三个表的模式,您将看到一些额外的复杂性,但有一个相当标准的方法来做到这一点。

DECLARE @holder TABLE (PersonID BIGINT, CustomerStatus NVARCHAR(100), WorkerStatus NVARCHAR(100))
INSERT INTO @Person (FirstName, MIddleNameS, Surname, Phone, Email) 
OUTPUT INSERTED.ID, @CustomerStatus, @WorkerStatus INTO @holder  (PersonID, CustomerStatus, WorkerStatus) VALUES 
(@FirstName, @MiddleNameS, @Surname, @Phone, @Email);

INSERT INTO @Customer (PersonID, Status)
SELECT PersonID, CustomerStatus
  FROM @holder;

INSERT INTO @Worker (PersonID, Status)
SELECT PersonID, WorkerStatus
  FROM @holder;

首先,我们声明一个表变量来保存生成的ID以及worker和customer状态值。
然后,我们使用OUTPUT子句向Person执行插入操作,这允许我们捕获插入到表中的行值。
现在,我们只需要将这些值插入到它们的表中,并显示状态。
这回答了你的问题,即使你被建议调整你的模式。我们不知道你想这样做的所有原因,也许在需求的某个地方它是必要的,我们不知道。
最后,谈谈您可能希望使用这种模式的场景。考虑联系人信息。您可能希望为单个Person存储多个不同的值(手机、电子邮件、家庭电话、工作电子邮件等)。因为您有一个一对多的关系,所以将其从父表中分离出来是完全有意义的(我前面关于子属性的评论)。

相关问题