복붙노트

[SQL] 어떻게 SQL 서버에서 동시에 두 테이블에 데이터를 삽입 할 수 있습니까?

SQL

어떻게 SQL 서버에서 동시에 두 테이블에 데이터를 삽입 할 수 있습니까?

의 내 테이블 구조는 다음과 같은 형태 가정 해 봅시다 :

CREATE TABLE [dbo].[table1] (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [data] [varchar](255) NOT NULL,
    CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ([id] ASC)
)

CREATE TABLE [dbo].[table2] (
    [id] [int] IDENTITY(1,1) NOT NULL,
    [table1_id] [int] NOT NULL,
    [data] [varchar](255) NOT NULL,
    CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED ([id] ASC)
)

두 번째의 [table1_id] 필드 내지 제 대응 테이블의 [ID] 필드. 내가 뭘하고 싶은 하나의 트랜잭션에서 두 테이블에 삽입 데이터입니다. 지금은 이미 다음과 같이 INSERT-SELECT-INSERT를 수행하여이 작업을 수행하는 방법을 알고 :

BEGIN TRANSACTION;
DECLARE @id [int];
INSERT INTO [table1] ([data]) VALUES ('row 1');
SELECT @id = SCOPE_IDENTITY();
INSERT INTO [table2] ([table1_id], [data]) VALUES (@id, 'more of row 1');
COMMIT TRANSACTION;

즉 같은 작은 경우에 대한 모든 좋은 괜찮아요 당신은 아마 행의 소수를 삽입하는 곳. 하지만 내가해야 할 것은 한 번에 몇 삽입 가능 십만 행, 심지어 백만 행, 모든입니다. 데이터는 난 그냥이 작업을 수행해야 할 것, 난 단지 하나의 테이블에 삽입 된 경우 그렇게 쉽게 될 것이다, 다른 테이블에서오고있다 :

INSERT INTO [table] ([data])
SELECT [data] FROM [external_table];

그러나 나는이 문제를 어떻게 할 것이며 내가하고 있어요 같이 적절한 [table1_id]의 스틸 [표 1]에 데이터 및 [표 2] 및 업데이트 [표 2] 분할? 그조차 할 수 있습니까?

해결법

  1. ==============================

    1.이 시도:

    이 시도:

    insert into [table] ([data])
    output inserted.id, inserted.data into table2
    select [data] from [external_table]
    

    UPDATE : 재 :

    INSERT INTO [table1] ([data]) 
    OUTPUT [inserted].[id], [external_table].[col2] 
    INTO [table2] SELECT [col1] 
    FROM [external_table] 
    

    난 당신이 뭔가를 할 수 있다고 생각, 그래서 그것은 삽입 문에서 출력 외부 열에 불가능

    merge into [table1] as t
    using [external_table] as s
    on 1=0 --modify this predicate as necessary
    when not matched then insert (data)
    values (s.[col1])
    output inserted.id, s.[col2] into [table2]
    ;
    
  2. ==============================

    2.나는이 문제를 고민하고, 가장 좋은 방법은 커서를 사용하는 것을 알게되었다.

    나는이 문제를 고민하고, 가장 좋은 방법은 커서를 사용하는 것을 알게되었다.

    나는 OUTPUT과 데니스 솔루션을 시도,하지만 그는 mentiond, 그것은 삽입 문에서 출력 외부 열을 불가능하고, MERGE 작업을 할 수없는 경우를 선택하여 여러 행을 삽입합니다.

    그래서, 나는 외부 테이블의 각 행에 대해, 나는 다음 다른 INSERT의 @@ IDENTITY를 사용하는 INSERT 짓을했는지, 커서를 사용했습니다.

    DECLARE @OuterID int
    
    DECLARE MY_CURSOR CURSOR 
      LOCAL STATIC READ_ONLY FORWARD_ONLY
    FOR 
    SELECT  ID FROM   [external_Table]
    
    OPEN MY_CURSOR
    FETCH NEXT FROM MY_CURSOR INTO @OuterID
    
    WHILE @@FETCH_STATUS = 0
    BEGIN 
    INSERT INTO [Table]   (data)
        SELECT data
        FROM     [external_Table] where ID = @OuterID 
    
        INSERT INTO [second_table] (FK,OuterID)
        VALUES(@OuterID,@@identity)
    
        FETCH NEXT FROM MY_CURSOR INTO @OuterID
    END
    CLOSE MY_CURSOR
    DEALLOCATE MY_CURSOR
    
  3. ==============================

    3.SQL Server가 'INSERT ALL'정책을 지원하기위한 모습을 유지합니다. 오라클은이 (SQL 요리 책)과 같은, 이미이 있습니다

    SQL Server가 'INSERT ALL'정책을 지원하기위한 모습을 유지합니다. 오라클은이 (SQL 요리 책)과 같은, 이미이 있습니다

    insert all
      when loc in ('NEW YORK', 'BOSTON') THEN
       into dept_east(deptno, dname, loc) values(deptno, dname, loc)
      when loc in ('CHICAGO') THEN
       into dept_mid(deptno, dname, loc) values(deptno, dname, loc)
      else
       into dept_west(deptno, dname, loc) values(deptno, dname, loc)
    select deptno, dname, loc
      from dept
    
  4. ==============================

    4.

    BEGIN TRANSACTION;
    
    DECLARE @tblMapping table(sourceid int, destid int)
    
    INSERT INTO [table1] ([data]) 
    OUTPUT source.id, new.id
    Select [data] from [external_table] source;
    
    INSERT INTO [table2] ([table1_id], [data])
    Select map.destid, source.[more data] 
    from [external_table] source
        inner join @tblMapping map on source.id=map.sourceid;
    
    COMMIT TRANSACTION;
    
  5. ==============================

    5.

    Create table #temp1
    (
     id int identity(1,1),
     name varchar(50),
     profession varchar(50)
    )
    
    Create table #temp2
    (
     id int identity(1,1),
     name varchar(50),
     profession varchar(50)
    )
    

    ----- 주요 질의 ------

    insert into #temp1(name,profession)
    
    output inserted.name,inserted.profession into #temp2
    
    select 'Shekhar','IT'
    
  6. ==============================

    6.당신은 당신이 제안하는 트랜잭션을 반복 할 저장 프로 시저를 작성할 수 있습니다. 반복자는 원본 데이터가 들어있는 테이블에 대한 커서 것이다.

    당신은 당신이 제안하는 트랜잭션을 반복 할 저장 프로 시저를 작성할 수 있습니다. 반복자는 원본 데이터가 들어있는 테이블에 대한 커서 것이다.

  7. ==============================

    7.또 다른 옵션은 제대로 poulate하는 업데이트를 실행의 FK 컬럼의 널 (null)을두고, 별도로 두 개의 삽입을 실행하는 것입니다.

    또 다른 옵션은 제대로 poulate하는 업데이트를 실행의 FK 컬럼의 널 (null)을두고, 별도로 두 개의 삽입을 실행하는 것입니다.

    하나 개의 레코드에서 다른 일치 (가능성이) 다음 임시 GUID 열을 생성하고 데이터에이를 채우고 두 필드에 삽입하는 두 개의 테이블에 저장 자연 아무것도 존재하지 않는 경우. 그럼 당신은 GUID를 밖으로 적절한 FK와 null를 업데이트 할 수 있습니다.

    예 :. :

    CREATE TABLE [dbo].[table1] ( 
        [id] [int] IDENTITY(1,1) NOT NULL, 
        [data] [varchar](255) NOT NULL, 
        CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ([id] ASC),
        JoinGuid UniqueIdentifier NULL
    ) 
    
    CREATE TABLE [dbo].[table2] ( 
        [id] [int] IDENTITY(1,1) NOT NULL, 
        [table1_id] [int] NULL, 
        [data] [varchar](255) NOT NULL, 
        CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED ([id] ASC),
        JoinGuid UniqueIdentifier NULL
    ) 
    
    
    INSERT INTO Table1....
    
    INSERT INTO Table2....
    
    UPDATE b
    SET table1_id = a.id
    FROM Table1 a
    JOIN Table2 b on a.JoinGuid = b.JoinGuid
    WHERE b.table1_id IS NULL
    
    UPDATE Table1 SET JoinGuid = NULL
    UPDATE Table2 SET JoinGuid = NULL
    
  8. from https://stackoverflow.com/questions/3712678/how-can-i-insert-data-into-two-tables-simultaneously-in-sql-server by cc-by-sa and MIT license