我有三个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
表中,需要保留customerID
、personID
和status
。
1条答案
按热度按时间fnatzsnv1#
您将您的问题标记为TSQL,所以我假设这就是您想要的,尽管使用了无效的语法来描述表。
首先,让我们讨论一下如何提供演示数据和对象。这是一种简单的方法,任何人都可以复制和粘贴:
您可以轻松地将演示数据插入到这些表中,但对于本例,我们不需要任何数据。
继续回答问题。上一条注解是正确的。根据您的描述,这应该是一个表,而不是三个表。CustomerStatus和WorkerStatus只是Person对象的属性。它们没有其他属性,不会多次存在。
这使得存储过程内容的正确答案类似于:
这只是将值(假设它们将被传递给存储过程)插入到表中。
如果您坚持要使用三个表的模式,您将看到一些额外的复杂性,但有一个相当标准的方法来做到这一点。
首先,我们声明一个表变量来保存生成的ID以及worker和customer状态值。
然后,我们使用OUTPUT子句向Person执行插入操作,这允许我们捕获插入到表中的行值。
现在,我们只需要将这些值插入到它们的表中,并显示状态。
这回答了你的问题,即使你被建议调整你的模式。我们不知道你想这样做的所有原因,也许在需求的某个地方它是必要的,我们不知道。
最后,谈谈您可能希望使用这种模式的场景。考虑联系人信息。您可能希望为单个Person存储多个不同的值(手机、电子邮件、家庭电话、工作电子邮件等)。因为您有一个一对多的关系,所以将其从父表中分离出来是完全有意义的(我前面关于子属性的评论)。