MS SQL Server에서 테이블의 데이터를 다른 테이블로 복사해야 할 경우가 종종 생깁니다.
가장 많이 사용할 때가 대량으로 테이블의 레코드를 변경하기 전에 임의로 백업을 해 놓을 때입니다.
월 또는 년도와 같이 특정 기간이 바뀔 때 데이터를 모두 다른 테이블로 복사 또는 백업을 한다든지, 대량의 변경(Update) 작업을 진행하기 전에 백업용으로 다른 테이블로 데이터를 모두 복사해 놓는 작업을 먼저 하게 됩니다.
이번 글에서는 MS SQL 테이블 간에 복사 방법 및 데이터 복사 또는 구조만 복사 방법에 대해 알아보겠습니다.
즉, 하나의 테이블에서 SELECT 해서 다른 테이블에 INSERT 하는 방법에 대한 설명입니다.
MSSQL 테이블을 새로 만들면서 다른 테이블의 데이터를 복사하는 방법
테이블을 새로 만들면서 데이터를 복사하는 방법은 가장 간단하게 사용할 수 있는 방법이면서 가장 많이 사용하는 방법입니다.
SELECT * INTO BackupTable
FROM SourceTable
|
SELECT INTO를 사용하면 INTO 뒤의 테이블 이름으로 새로운 테이블을 만들고 FROM 테이블의 데이터를 복사합니다.
FROM 뒤에 WHERE를 사용하여 필요한 데이터만 새로 만들어진 테이블에 복사할 수 있습니다.
SELECT * INTO BackupTable
FROM SourceTable
WHERE colYear = ‘2022’
|
MSSQL 테이블을 새로 만들면서 테이블 구조만 복사하는 방법
테이블에 있는 데이터는 무시하고 테이블이 구조만 복사해서 새로운 테이블을 만들 때 사용할 수 있는 방법입니다.
SELECT * INTO [생성할 테이블 이름] FROM [구조 복사할 테이블 이름] WHERE 1=2
SELECT * INTO BackupTable FROM SourceTable WHERE 1=2
|
데이터는 생성하지 않고, 테이블 구조만 복사하기 위해 WHERE 뒤에 1=2를 입력해 주었습니다.
WHERE 절에 절대로 참(True) 될 수 없는 조건식을 입력해 주면 됩니다.
두 테이블의 컬럼(Column) 정의가 정확히 일치하는 경우 두 테이블 간에 데이터를 복사하는 방법
기존의 테이블에 다른 테이블의 데이터를 복사하는 경우, 두 테이블의 컬럼(Column)이 서로 동일한 경우에 간단하게 사용할 수 있는 방법입니다.
INSERT INTO BackupTable
SELECT * FROM SourceTable
|
여기서도 FROM 뒤에 WHERE를 사용하여 필요한 데이터만 기존 테이블에 추가로 복사할 수 있습니다.
두 테이블의 컬럼(Column) 정의가 다른 경우 두 테이블 간에 데이터를 복사하는 방법
기존의 테이블에 다른 테이블의 데이터를 복사하는 경우, 컬럼(Column)의 정의가 서로 다른 경우에는 복사를 해주는 쪽의 테이블의 컬럼과 복사를 받는 쪽의 테이블의 컬럼을 서로 순서에 맞도록 매칭되게 정의해 주어야 합니다.
칼럼 이름은 서로 달라도 되지만 컬럼의 Data Type은 서로 일치해야 오류가 발생하지 않습니다.
INSERT INTO BackupTable (colYear, colAmount)
SELECT colLastYear, colLastAmount FROM SourceTable
|
여기서도 FROM 뒤에 WHERE를 사용하여 필요한 데이터만 기존 테이블에 추가로 복사할 수 있습니다.
ID(Identity) 컬럼이 있는 테이블을 복사할 때 주의할 점
테이블에 ID 열이 있는 경우 테이블을 복사할 때 주의할 점이 있습니다.
ID(Identity) 칼럼은 데이터가 추가될 때 자동으로 부여되는 정수형의 컬럼입니다. 따라서 ID 칼럼은 직접 데이터를 지정할 수 없습니다.
▼ 테이블의 데이터를 복사할 때 IDENTITY 값은 무시해도 될 경우
INSERT INTO BackupTable (colYear, colAmount)
SELECT colLastYear, colLastAmount FROM SourceTable
|
- IDENTITY 컬럼은 복사하는 컬럼에서 제외하면 자동으로 ID 값은 만들어 집니다.
▼ 테이블의 데이터를 복사할 때 IDENTITY 값은 동일하게 유지해야 할 경우
SET IDENTITY_INSERT BackupTable ON;
INSERT INTO BackupTable (colID, colYear, colAmount)
SELECT colID, colLastYear, colLastAmount FROM SourceTable
SET IDENTITY_INSERT BackupTable OFF;
|
- 데이터가 추가되는 테이블의 IDENTITY_INSERT를 ON을 해주고 추가한 다음 OFF로 다시 변경해 주어야 합니다.
- ※ 만약 데이터가 추가되는 테이블의 ID값이 이미 존재할 경우 당연히 INSERT 오류가 발생합니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
- SQL 기초 구문 – 가장 가까운 정수로 올림, 버림, 반올림 하는 방법
- MS SQL에서 특정 컬럼(Column)이 포함된 테이블(Table)을 모두 찾기 방법
- Unable to find specified column in result set 오류 원인 및 해결 방법
- 오라클 ORA-00904: invalid identifier 오류 발생 원인 및 오류 해결 방법
- 오라클 ORA-01438 오류 발생 원인과 해결 방법
- 오라클 ORA-01789:query block has incorrect number of result columns 오류해결
이 글이 도움이 되었기를 바랍니다. ^-^