我创建了两个表:
表tblStaff的列id(主键,自动递增)name,age,address
tblStaff
id
name
age
address
表tblRoleOfStaff的列id(主键,自动递增), StaffId(外键tblStaff)RoleId
tblRoleOfStaff
StaffId
RoleId
我有表格来创建具有现有角色的新员工。要插入的数据样本:
(name, age, address, roleId) = ('my name',20,'San Jose', 1)
我想在SQL Server 2014中编写一个存储过程,以向新插入的人员tblStaff插入新记录,并tbleRoleOfStaff在staffId刚插入的情况下向其中插入新记录。
tbleRoleOfStaff
staffId
我该怎么办?
如果我的问题与其他人重复,我非常抱歉。我在SQL方面比较新鲜。谢谢你的帮助。
使用SCOPE_IDENTITY()第二次插入tblRoleOfStuff的位置StaffId。喜欢:
tblRoleOfStuff
insert into tblStaff values (@name, @age, @address) insert into tblRoleOfStuff values (scope_identity(), @roleid)
编辑
这个答案有太多评论,所以我想解释一下。
如果OP保证他不会使用他可能会使用的任何触发器@@IDENTITY(不良做法),则足以满足他的需求,但可以使用最佳做法SCOPE_IDENTITY()。
@@IDENTITY
SCOPE_IDENTITY()
与@@ IDENTITY一样,SCOPE_IDENTITY()将返回在当前会话中创建的最后一个标识值,但也将其限制为当前范围。换句话说,它将返回您显式创建的最后一个标识值,而不是由触发器或用户定义的函数创建的任何标识。
SCOPE_IDENTITY() 将保证您从当前操作中获得身份,而不是从另一个连接或最后一个处理中获得身份。
为什么不IDENT_CURRENT呢?因为
IDENT_CURRENT
IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表。IDENT_CURRENT返回在任何会话和任何作用域中为特定表生成的标识值。
因此,您需要采用最后一个作用域而不是当前作用域。是的,OP也可以使用它,但是在这种情况下,这是一个不好的做法(例如仅使用@@IDENTITY)
使用OUTPUT确实是一种好习惯,但是对于一个身份而言,使用起来却过于复杂。如果OP需要一次处理多于一行,是的,他需要 OUTPUT。
OUTPUT