SQL Server:插入到2个表中
当我将记录添加到SQL Server:插入到2个表中,sql,sql-server,select,insert-into,Sql,Sql Server,Select,Insert Into,当我将记录添加到PERSONS表中时,ID列将自动递增(标识) 我需要这个ID将一条记录插入ADDRESS表中,这样我就可以同时加入这两条记录 有人知道当我有多行要追加时,如何在第二条语句中使用这个ID 基本上,它将追加一行,并使用ID将该行追加到另一个表中 我希望避免循环每个记录来执行此操作 先谢谢你 INSERT INTO PERSONS (FIRST_NAME, LAST_NAME) SELECT FIRST_NAME, LAST_NAME FROM CONTACTS
PERSONS
表中时,ID
列将自动递增(标识)
我需要这个ID将一条记录插入ADDRESS
表中,这样我就可以同时加入这两条记录
有人知道当我有多行要追加时,如何在第二条语句中使用这个ID
基本上,它将追加一行,并使用ID将该行追加到另一个表中
我希望避免循环每个记录来执行此操作
先谢谢你
INSERT INTO PERSONS (FIRST_NAME, LAST_NAME)
SELECT FIRST_NAME, LAST_NAME
FROM CONTACTS
INSERT INTO ADDRESS (PERSON_ID)
SELECT ID
FROM PERSONS
您可以使用
插入。。。插入的输出。。。进入
INSERT @PERSONS
(FIRST_NAME,
LAST_NAME)
OUTPUT Inserted.Id
INTO @ADDRESS
SELECT *
FROM @CONTACTS;
或者,如果您的需求更复杂,另一种可能是合并语句
DECLARE @CONTACTS table ( FIRST_NAME varchar(50) , LAST_NAME varchar(50))
DECLARE @PERSONS table (Id int identity , FIRST_NAME varchar(50) , LAST_NAME varchar(50))
DECLARE @ADDRESS table (PERSON_ID int)
INSERT @CONTACTS VALUES ('FIRST_NAME1' , 'LAST_NAME2'), ('FIRST_NAME1' , 'LAST_NAME2');
MERGE @PERSONS t
using @CONTACTS s
on
t.FIRST_NAME = s.FIRST_NAME
AND t.LAST_NAME = s.LAST_NAME
WHEN NOT MATCHED THEN INSERT (FIRST_NAME, LAST_NAME ) Values (s.FIRST_NAME , s.LAST_NAME)
OUTPUT Inserted.Id into @ADDRESS;
餐桌上的人
select * from @PERSONS
Id FIRST_NAME LAST_NAME
----------- -------------------------------------------------- --------------------------------------------------
1 FIRST_NAME1 LAST_NAME2
2 FIRST_NAME1 LAST_NAME2
表地址
SELECT * from @ADDRESS
PERSON_ID
-----------
1
2
为了将@GordonLinoff和@scsimon给出的答案形象化,我创建了一个小的。您可以查看完整的Microsoft指南中的触发器 :
创建表格联系人(
名字varchar(50)
,姓varchar(50)
);
去
创建表人员(
Id整数标识(1,1)
,名为varchar(50)
,姓varchar(50)
);
去
创建表地址(
个人识别码
);
去
在人员上创建触发器TR_AI_Persons_PersonAddress
插入后
作为
开始
插入地址(人员ID)从插入的地址中选择ID
结束
:
在联系人(名字、姓氏)中插入值(“Bob”、“White”);
在联系人(名字、姓氏)中插入值('Tom'、'Black');
插入人员(姓名、姓氏)
从联系人中选择名字、姓氏
从地址中选择*代码>一种方法是使用触发器。有一种非常标准的模式使用MERGE语句,或者使用OUTPUT语句到temp表并从中插入到子表中。在第一次插入中,我假设您插入了多行。。。您想将这些相同的行(Persons表中的ID)插入address表吗?如果它是一条记录,那么它是可管理的,否则我会使用@GordonLinoff并使用触发器。实际上只要使用触发器就行了,因为这就是它的用途。@scsimon-插入输出。。。INTO
就是为了这个目的,所以按照这个逻辑,他们应该使用它。是的@MartinSmith,但是有一些已经被微软记录下来了,我不愿意打赌没有出现更多。我不认为问题中对insert if not exists and MERGE有任何要求,而不是简单的insert。。。输出
批量插入时,无法创建标识。选项创建触发器,但在某些情况下它不是选项。在merge语句中,您可以获得要使用的输出。insert上也存在output子句。谢谢大家的帮助。不真正用于合并和触发器。我尝试插入输出,但它没有返回我想要的结果。我会想出办法的。谢谢你的帮助。不是真的与触发器一起使用。我尝试插入输出,但它没有返回我想要的结果。我会想办法解决的。