SQL Server:INSERT INTO 2表

时间:2017-09-14 18:26:28

标签: 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

INSERT INTO ADDRESS (PERSON_ID)
    SELECT ID 
    FROM PERSONS

2 个答案:

答案 0 :(得分:1)

您可以使用INSERT ... OUTPUT INSERTED ... INTO

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

答案 1 :(得分:0)

为了可视化@GordonLinoff和@scsimon给出的答案,我创建了一个小demo。您可以查看完整的Microsoft触发器here指南。

<强> DDL

CREATE TABLE CONTACTS ( FIRST_NAME varchar(50) , LAST_NAME varchar(50) ); GO CREATE TABLE PERSONS ( Id int IDENTITY(1,1) , FIRST_NAME varchar(50) , LAST_NAME varchar(50) ); GO CREATE TABLE ADDRESS ( PERSON_ID int ); GO CREATE TRIGGER TR_AI_Persons_PersonAddress ON PERSONS AFTER INSERT AS BEGIN INSERT INTO ADDRESS (PERSON_ID) SELECT Id FROM inserted END

<强> DML INSERT INTO CONTACTS(FIRST_NAME, LAST_NAME) VALUES('Bob', 'White'); INSERT INTO CONTACTS(FIRST_NAME, LAST_NAME) VALUES('Tom', 'Black'); INSERT INTO PERSONS (FIRST_NAME, LAST_NAME) SELECT FIRST_NAME, LAST_NAME FROM CONTACTS;
SELECT * FROM ADDRESS;