我创建了两个表:
>
具有列 ID
(主键、自动递增)、名称
、期限
、地址
的表 tblStaff
表tblRoleOfBar
包含列id
(主键,自动增量),StaffId
(tblBar
的外键),RoleId
我有表格来创建具有现有角色的新员工。要插入的数据示例:
(name, age, address, roleId) = ('my name',20,'San Jose', 1)
我想在SQL Server 2014中编写一个存储过程,将新的staff插入到<code>tblStaff。
那我该怎么办?
如果我的问题与其他问题重复,我很抱歉。我对SQL更感兴趣。谢谢你的帮助。
您可以使用<code>从第一条insert语句输出。
declare @tmp table(id int)
insert tblStaff (name, age, address)
OUTPUT inserted.Id INTO @tmp (id)
values (@name, @age, @address)
declare @roleId int = 1 --or whatever
insert tblRoleOfStaff (staffId,roleId)
select id, @roleId
from @tmp
您也可以一次插入多个角色。
create table Roles (roleId int identity(1,1) primary key,
RoleName varchar(50),
isDefaultRole bit default 0
)
--mark some roles as default (`isDefaultRole = 1`)
--the 2nd insert will be
insert tblRoleOfStaff (staffId,roleId)
select id, roleId
from @tmp
cross join Roles
where isDefaultRole = 1
因为看起来您一次讨论一行,有些人可能会告诉您使用像@@IDENTITY
或其他一些系统,但为了更确定地确保我推荐插入语句的OUTPUT
子句。这种方法的好处是它可以很容易地适应一次处理多行。
DECLARE @Output AS TABLE (StaffId INT)
INSERT INTO tblStaff (name, age, address)
OUTPUT inserted.Id INTO @Output (StaffId)
VALUES (@name, @age, @address)
DECLARE @StaffId INT
SELECT @StaffId = StaffId FROM @Output
INSERT INTO tblRoleOfStaff (StaffId, RoleId)
VALUES (@StaffId,@RoleId)
不使用< code>@@IDENTITY的原因,以防执行与您的操作相关的其他操作。例如,触发器将另一行插入到另一个表中,或者更新数据库中的另一条记录。,当触发器修改同一个表时,< code>SCOPE_IDENTITY也有类似的不足。< code>IDENT_CURRENT也有一个缺点。做一个互联网搜索来了解更多关于这些有大量的资源。
使用SCOPE_IDENTITY()第二次插入到tblRoleOfStuff
中,位于StaffId
的位置。像:
insert into tblStaff values
(@name, @age, @address)
insert into tblRoleOfStuff values
(scope_identity(), @roleid)
编辑
对这个答案有太多的评论,所以我想解释一下。
如果OP保证他不会使用任何触发器,他可以使用< code>@@IDENTITY(不好的做法),这足以满足他的需要,但最佳做法是使用< code>SCOPE_IDENTITY()。
SCOPE_IDENTITY()与@@IDENTITY一样,将返回当前会话中创建的最后一个标识值,但它也将其限制在您当前的范围内。换句话说,它将返回您显式创建的最后一个标识值,而不是触发器或用户定义函数创建的任何标识。
SCOPE_IDENTITY()
将保证您从当前操作中获得标识,而不是从另一个连接或最后一个处理的连接中获得标识。
为什么不IDENT_CURRENT
?因为
IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表。IDENT_CURRENT返回为任何会话和任何作用域中的特定表生成的标识值。
因此,您将其作为最后一个作用域,而不是当前作用域。是的,OP也可以使用它,但在这种情况下这是一种不好的做法(比如只使用@@IDENTITY
)
使用< code>OUTPUT确实是很好的实践,但是对于一个身份来说太复杂了。如果OP需要一次处理不止一行——是的,他需要< code >输出。
批量订单 Purchorder 我已经试了一个星期了。我有这两个表,batchporder和purchord在batchporder表中,我需要插入一行,并获得传递给purchord插入的主id。在purchord中,我需要插入多行,因此我使用了insert\u batch。 控制器 模型 错误1 遇到PHP错误严重性:警告 消息:array_keys()要求参数1为数组,字符串为给定值 文件名:
问题内容: 我有本身具有外键的表。列 parentid 是外键, 不能 为NULL。 如果我这样做,那么它说不能将NULL插入 父母的父母 。但是,如果还没有插入行,我可以为它设置什么值呢? 我如何编写将向该表添加行的脚本? 谢谢 问题答案: 技巧:拥有一个带有虚拟密钥的虚拟行,例如99999。将其插入为FK,然后将FK更改为其实际值。并在交易中完成。
我在MySQL中有下表。 表1(身份证、名字、姓氏、电话号码) 表2(TID、电子邮件) 我在 Table1 中有 25000 行,而我的 Table2 包含 20000 行。我在表 2 中的 TID 是引用表 1 的主键 ID 的外键。如果姓氏为 NULL,则 Table2 中将不存在这些 ID。现在,我正在尝试仅针对具有姓氏的表合并这两个表。 我重新定义了表2的模式,如下所示。 Table2(
我们系统的所有用户都来自一个主“用户”类。同样,我们希望以相同的方式构造数据库,拥有一个主“用户”表,该表与特定用户类型的必要表连接,以提供额外的用户信息。 以这三个基本表格为例: 表用户 user_id|user_email|user_firstname|user_lastname|... 表雇员 user_id|employee_staff_number|... 表管理 user_id|adm
表1有col1、col2、col3、col4、col5列 表2有col1、col3、col5列 我想将表2中的行插入表1 但是col2,col4在插入表2后应该是NULL数据类型 我怎么能在蜂巢,目前我正在使用Hortonworks 3.1版本
问题内容: 我有一个列表,例如:thing1,thing2,thing3。我想将它们插入具有相同外键的查找表中。因此理想情况下,它看起来应该像这样: 看来完成此操作的唯一方法是将列表转换为查询,但是我想知道,是否有更简单的方法? 这是我尝试过的: 我听说您无法在cfquery中执行cfloop,但是我什至不确定这是否成立,因为VALUES中没有逗号,并且我不确定如何说“ cfloop中的“当前迭代