一尘不染

如何将值插入具有外键关系的两个表中?

sql

我创建了两个表:

  • tblStaff的列id(主键,自动递增)nameageaddress

  • tblRoleOfStaff的列id(主键,自动递增), StaffId(外键tblStaffRoleId

我有表格来创建具有现有角色的新员工。要插入的数据样本:

(name, age, address, roleId) = ('my name',20,'San Jose', 1)

我想在SQL Server
2014中编写一个存储过程,以向新插入的人员tblStaff插入新记录,并tbleRoleOfStaffstaffId刚插入的情况下向其中插入新记录。

我该怎么办?

如果我的问题与其他人重复,我非常抱歉。我在SQL方面比较新鲜。谢谢你的帮助。


阅读 129

收藏
2021-03-17

共1个答案

一尘不染

使用SCOPE_IDENTITY()第二次插入tblRoleOfStuff的位置StaffId。喜欢:

insert into tblStaff values
(@name, @age, @address)

insert into tblRoleOfStuff values
(scope_identity(), @roleid)

编辑

这个答案有太多评论,所以我想解释一下。

如果OP保证他不会使用他可能会使用的任何触发器@@IDENTITY(不良做法),则足以满足他的需求,但可以使用最佳做法SCOPE_IDENTITY()

与@@
IDENTITY一样,SCOPE_IDENTITY()将返回在当前会话中创建的最后一个标识值,但也将其限制为当前范围。换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识。

SCOPE_IDENTITY() 将保证您从当前操作中获得身份,而不是从另一个连接或最后一个处理中获得身份。

为什么不IDENT_CURRENT呢?因为

IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表。IDENT_CURRENT返回在任何会话和任何作用域中为特定表生成的标识值。

因此,您需要采用最后一个作用域而不是当前作用域。是的,OP也可以使用它,但是在这种情况下,这是一个不好的做法(例如仅使用@@IDENTITY

使用OUTPUT确实是一种好习惯,但是对于一个身份而言,使用起来却过于复杂。如果OP需要一次处理多于一行,是的,他需要 OUTPUT

2021-03-17