[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.이 시도:
이 시도:
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.나는이 문제를 고민하고, 가장 좋은 방법은 커서를 사용하는 것을 알게되었다.
나는이 문제를 고민하고, 가장 좋은 방법은 커서를 사용하는 것을 알게되었다.
나는 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.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.
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.
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.당신은 당신이 제안하는 트랜잭션을 반복 할 저장 프로 시저를 작성할 수 있습니다. 반복자는 원본 데이터가 들어있는 테이블에 대한 커서 것이다.
당신은 당신이 제안하는 트랜잭션을 반복 할 저장 프로 시저를 작성할 수 있습니다. 반복자는 원본 데이터가 들어있는 테이블에 대한 커서 것이다.
-
==============================
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
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
'SQL' 카테고리의 다른 글
[SQL] MySQL의 업데이트 쿼리의 증가 값 (0) | 2020.04.13 |
---|---|
[SQL] SQL 서버는 어디 식 케이스를 무시 (0) | 2020.04.13 |
[SQL] MySQL의 SQL은 : 특정 항목을 먼저하고 그 다음 나머지 항목을 정렬 (0) | 2020.04.13 |
[SQL] SQL은 두 개의 테이블에서 데이터를 비교 (0) | 2020.04.13 |
[SQL] 교리 2 사용하여 원시 SQL을 실행 (0) | 2020.04.13 |