SQL Server에서 한 데이터베이스에서 다른 데이터베이스로 테이블 복사


324

foo라는 데이터베이스와 bar라는 데이터베이스가 있습니다. foo에 tblFoobar라는 테이블이 있는데 데이터베이스 foo에서 데이터베이스 막대로 (데이터 및 모두) 이동하려고합니다. 이 작업을 수행하기위한 SQL 문은 무엇입니까?

답변:


208

SQL Server에서? 같은 데이터베이스 서버에서? 세 부분으로 명명합니다.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

이것은 단지 데이터를 이동시킵니다. 테이블 정의 (및 권한 및 인덱스와 같은 다른 속성)를 이동하려면 다른 작업을 수행해야합니다.


또한 테이블 권한을 별도로 설정해야한다고 생각합니다.
Ken Ray

1
신원 정보 삽입을 수행 해야하는 경우 데이터 가져 오기 마법사에서 해당 옵션을 사용할 수 있습니다 ^^-다른 답변 참조
Clarence Liu

13
@TahaRehmanSiddiqui : 질문에 대답하기 때문에;) 데이터베이스 서버간에 복사하는 방법을 묻지 않았습니다. 그러나 구글이 첫 번째 결과로 그것을 제공하기 때문에 그 답변을 찾는 대부분의 사람들이 여기에 끝납니다 :)
Maarten Kieft

1
@RyanB 예, 허용됩니다.
Amy B

1
@Tom OP와이 질문에 나오는 많은 사람들은 도구가 아닌 "SQL 문"을 찾고 있습니다.
Amy B

535

SQL Server Management Studio의 "데이터 가져 오기"작업 (DB 이름을 마우스 오른쪽 단추로 클릭 한 다음 작업)이 대부분의 작업을 수행합니다. 데이터를 복사하려는 데이터베이스에서 실행하십시오.

테이블이 존재하지 않으면 테이블이 만들어 지지만 인덱스 등을 다시 만들어야 할 수도 있습니다. 테이블이 존재하면 기본적으로 새 데이터를 추가하지만 기존 데이터를 모두 삭제하도록 해당 맵핑을 편집 (매핑 편집) 할 수 있습니다.

나는 이것을 항상 사용하며 상당히 잘 작동합니다.


1
이 옵션을 찾을 수 없습니다. 여기에 특정 버전이 있습니까?
Nerrve

35
일반적으로 더 나은 대답이라고 말할 수는 없습니다. 예를 들어 스크립트 내에서 자동화를 호출하는 것은 사용할 수 없습니다. BTW 저자는 "..SQL 문 .."을 구체적으로 요청했습니다. 그러나 물론 그것은 큰 대답이지만 더 나은 대답은 아닙니다.).
그리즐리

3
저자는 "(data and all)"을 이동하도록 요청했습니다. 이 답변이 그렇게되기를 바랍니다. 테이블을 작성하지만 키나 색인을 작성하지 않습니다. 따라서 SQL 응답에 비해 크게 개선되지 않았습니다.
unubar

WHERE데이터 가져 오기 작업 을 사용하여 조건 을 지정할 수 있습니까? 그렇게 할 방법을 찾지 못했습니다.
호감

1
예이 언급 한 바와 같이 올바른 방법입니다 여기 너무,하지만 identityforeign key모든 솔루션, 참조 대상 데이터베이스에서 제거됩니다?
shaijut

106

이것은 작동해야합니다 :

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

constaint, defaults 또는 index 는 복사 하지 않습니다 . 생성 된 테이블 에는 클러스터형 인덱스 가 없습니다 .

또는 다음을 수행 할 수 있습니다.

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

대상 테이블이 존재하고 비어있는 경우


기본 테이블 구조 (필드 및 데이터)를 먼저 복사 한 다음 패치 스크립트를 적용하여 권한, 색인, 제한 조건 및 확장 특성을 작성하면 문제가 있습니까?
leoinfo

4
SQL Server 2008에서 ID 열의 값을 삽입하지 않습니다. 열 목록을 사용하고 대상 테이블에 대해 IDENTITY_INSERT가 ON 인 경우에만 허용됩니다.
Lucas Wilson-Richter

@Lucas-당신은 "반쪽"입니다 :). 그러나 첫 번째 SQL 문은 식별 컬럼 내의 값을 포함하여 모든 데이터를 복사합니다. 내가 말했듯이, 구속 조건은 생성되지 않습니다. 그러나 모든 데이터가 이동되면 소스 DB에서 쉽게 스크립트를 작성하고 대상 DB에 적용 할 수 있습니다.
leoinfo

두 번째 버전 ( INSERT INTO...)은 Oracle에서 저에게 효과적이었습니다.
vapcguy

두 데이터베이스가 다른 연결 문자열을 가진 완전히 다른 서버에있는 경우이 기능이 작동합니까? 그렇지 않으면 어떻게 처리합니까?
Alexander Ryan Baggett

46

그것이 하나의 테이블이라면 당신이해야 할 일은

  • 스크립트 테이블 정의
  • 다른 데이터베이스에서 새 테이블 만들기
  • 규칙, 색인, 권한 등
  • 데이터 가져 오기 (예에 대한 여러 삽입은 이미 위에 표시되어 있음)

고려해야 할 사항 중 하나는 나중에 다른 개체를 마이그레이션하는 것과 같은 다른 업데이트입니다. 소스 테이블과 대상 테이블의 이름이 동일하지 않습니다. 즉, 뷰, 저장 프로 시저 및 기타와 같은 종속 개체를 변경해야 할 수도 있습니다.

어떤 문제없이 수동으로 갈 수있는 하나 또는 여러 개의 개체를 정하십시오. 그러나 업데이트가 몇 개 이상인 경우 타사 비교 도구가 매우 유용합니다. 지금 은 스키마 마이그레이션에 ApexSQL Diff 를 사용하고 있지만 다른 도구로는 문제가 없습니다.


23
  1. 스크립트는 create table관리 스튜디오에서 테이블을 만들 줄에 해당 스크립트를 실행합니다. (오브젝트 탐색기에서 테이블을 마우스 오른쪽 버튼으로 클릭하고 스크립트 테이블을 다음으로 작성하십시오 ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table


1
나는이 접근법을 좋아한다. ID 열이 있으면 *가 작동하지 않습니다. 열 이름을 명시 적으로 나열해야합니다. 이 경우에도해야합니다 SET IDENTITY_INSERT TblName ON.
JeremyWeir 2016 년

16

당신은 또한 사용할 수 있습니다 생성 SQL 서버 스크립트 마법사 다음과 같은 작업을 수행 할 수 SQL 스크립트의 그것의 생성을 안내하기를 :

  • 테이블 스키마 복사
  • 제한 조건 (ID, 기본값 등)
  • 테이블 내의 데이터
  • 필요한 경우 다른 많은 옵션

스크린 샷이 표시된 SQL Server 2008의 좋은 워크 플로 예는 다음과 같습니다 .


위 내 의견을 참조하십시오?!? "어떻게 이런 일이 171분의 508 투표 수와 라이언의 않았다"10월 11일 '11 23시 41분에서 "대답 만 현재까지 13 얻을 라이언의는이 유일한 해답 . 그 대답은 연산의 Q의 완전 . 때문에 그것을 a) 신원 ( 매우 일반적), b) 제약 조건, c) 트리거, d) 색인, e) 권한, d) 스키마 및 데이터 복사 힌트 : op의 "(data and all)"의 "and all"부분은 Schema도 암시합니다.) e) "SQL statement"를 생성하여 op가 지정한 문자 그대로 문자 그대로 표시하는 것이 더 낫습니다. "보다."
Tom

1
참고 :이 답변은 행 수가 "과도한"(예 : 조회 / 작은 트랜잭션 테이블)이 아니고 "큰"열 값이없는 경우에만 실용적입니다. 이를 위해 Ryan의 답변을 사용하여 테이블에 대한 스크립트 (열 속성 및 하위 개체 포함) 생성을 생성 한 다음 David B의 "선택에 삽입"답변을 사용합니다. Ryan의 A 대신 단일 테이블의 경우 SSMS, 개체 탐색기, 마우스 오른쪽 단추 클릭 테이블, 스크립트 테이블을 CREATE To로 만들 수도 있지만 먼저 도구, 옵션, SQL Server 개체 탐색기, 스크립팅 옵션이 원하는대로 설정하십시오.
Tom

9

이 방법으로 갈 수 있습니다 : (일반적인 예)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

또한 insert 절에 넣고 열 이름을 생성 해야하는 경우 다음을 사용하십시오.

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

결과를 복사하여 쿼리 창에 붙여 넣어 테이블 열 이름을 나타내면 ID 열도 제외됩니다.

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

데이터베이스가 동일한 위치에있는 경우 행을 복사하는 스크립트가 작동합니다.


당신은 이것을 시도 할 수 있습니다.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

두 DB가 동일한 서버에있는 경우 서버 이름은 선택 사항입니다.


1

기존 테이블이 있고 데이터 만 복사하려는 경우이 쿼리를 시도 할 수 있습니다.

Destination_Existing_Tbl에 삽입하십시오. col1, col2 FROM Source_Tbl을 선택하십시오.


0

데이터 복사

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.