Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:插入到2个表中_Sql_Sql Server_Select_Insert Into - Fatal编程技术网

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子句。谢谢大家的帮助。不真正用于合并和触发器。我尝试插入输出,但它没有返回我想要的结果。我会想出办法的。谢谢你的帮助。不是真的与触发器一起使用。我尝试插入输出,但它没有返回我想要的结果。我会想办法解决的。