[SQL] 여러 파트 파일에 SQL 서버 테이블 내보내기
SQL여러 파트 파일에 SQL 서버 테이블 내보내기
나는 CSV 파일로 상당히 큰 SQL Server 테이블 ~ 1백기가바이트을 보내야합니다. 그러나 출력이 하나의 CSV 파일을 할 것이 아니라, 그것은 이상적으로 여러 개의 파일 10 개 파일 각각 10 기가 바이트 말을해야합니다.
나는 BCP는 BATCH_SIZE 인수를 가지고 볼 수 있지만 이것은 여전히 하나의 파일에 모든 데이터를 기록? 내가 무엇을 필요로하고 거기에 다른 무료 유틸리티가 있습니까? 어느 파일의 크기는 바이트 또는 행 수에 지정 될 수있는?
데이터가 내가 제안을 열려있어 데이터를 내보내는 더 나은 방법이 그렇다면, 하이브 / 하둡 플랫폼에서 다른 소스와 결합 될 수 있도록 상황에 맞는 비트의 경우입니다.
해결법
-
==============================
1.난 당신이 SQL 2012의 페이징 기능을 사용 OFFSET 및 bcp와 함께 FETCH 수 있다고 생각 :
난 당신이 SQL 2012의 페이징 기능을 사용 OFFSET 및 bcp와 함께 FETCH 수 있다고 생각 :
SELECT * FROM Table ORDER BY ID --Primary Key OFFSET 100000001 ROWS FETCH NEXT 100000000 ROWS ONLY
-
==============================
2.BCP의 BATCH_SIZE 인수는 불행하게도, 출력을 제어하지 않습니다.
BCP의 BATCH_SIZE 인수는 불행하게도, 출력을 제어하지 않습니다.
방법 나는 분할의 유형을 완료했습니다 :
1 - 단순하지만, 반복 불가 : 특정 행 범위에 대한 테이블을 통해 여러 BCPS를 실행하는 명령 파일 (.CMD)를 만듭니다. 이것은 아마도 테이블에 IDENTITY (1,1)을 기반으로 기본 키가 필요합니다.
bcp "SELECT * FROM MyTable WHERE Id BETWEEN 0 AND 10000000" queryout … bcp "SELECT * FROM MyTable WHERE Id BETWEEN 10000000 AND 20000000" queryout …
각 (주 바이트의 주어진 수의 필요에 따라 여러 가지 새로운 파일로 생성하는 하나의 파일 및 사용 분할에 전체 테이블 밖으로 BCP : -이 단순하고 반복, 디스크 많이 사용하는 선에 의해 분할이 더 나은 것 아이디어 IMO). 사용 'Cygwin에서'분할 및 원하는 다른 유틸리티를 설치 (GnuWin32는 더 이상 유지하지 않습니다).
bcp MyDb.MySchema.MyTable out C:\MyFile.csv -T -w split -b 10737418240 C:\MyFile.csv C:\MySplitFile_
다음 파일을 생성합니다
C:\MySplitFile_aaa C:\MySplitFile_aab …
저장 프로 시저 내에서 호출 BCP에 xp_cmdshell을 기능을 사용하는 테이블을 반복 : - 3 복잡하지만, 반복, 안전하지 T-SQL을 필요로한다.
DECLARE @loop AS INT; --Use WHILE to loop as needed-- DECLARE @sql AS VARCHAR(MAX); --Add code to generate dynamic SQL here-- DECLARE @bcp AS VARCHAR(MAX); SELECT @bcp='BCP "'+@sql+'" queryout C:\MyFolder\MyFile_'+@loop+'.csv';
FINAL 참고 : 데이터의 모든 NVARCHAR 필드를 사용하는 경우 다음 -w 플래그를 사용하여 출력이 UTF-16LE에있을 것입니다 점에 유의해야합니다. 난 강력하게 하둡에서와 아무것도하기 전에 (다시 'Cygwin에서'에서) UTF-8의 iconv를 사용하는 것이 변환 추천 할 것입니다.
-
==============================
3.단일 정렬 기본 키 필드를 가지고 있다면, 당신은 당신이 원하는 행의 경계를 정의하는 키를 찾을 수있는, 그럼 그냥 경계를 WHERE 그 정의를 사용하여 기록을 선택합니다.
단일 정렬 기본 키 필드를 가지고 있다면, 당신은 당신이 원하는 행의 경계를 정의하는 키를 찾을 수있는, 그럼 그냥 경계를 WHERE 그 정의를 사용하여 기록을 선택합니다.
이 조 1 위를 위해 무엇을 넣어 비슷하지만 키가 연속이나 숫자 일 필요는 없다. 다음은 간단한 예입니다 :
DECLARE @maxrowsperfile AS bigint = 1048576 DECLARE boundaries CURSOR FOR SELECT the_sortable_key FROM ( SELECT the_sortable_key , ROW_NUMBER() OVER(ORDER BY the_sortable_key) AS the_row_number FROM the_table ) AS t WHERE the_row_number % @maxrowsperfile = 0 OPEN boundaries DECLARE @lowerbound AS [key type] = [value A] DECLARE @upperbound AS [key type] = [value A] FETCH NEXT FROM boundaries INTO @upperbound IF @lowerbound = @upperbound PRINT 'bcp "SELECT * FROM the_table" queryout file -w -T' ELSE DECLARE @filecount AS int = 1 BEGIN WHILE @@FETCH_STATUS = 0 BEGIN PRINT 'bcp "SELECT * FROM the_table WHERE key > ' + CAST(@lowerbound AS varchar) + ' AND key <= ' + CAST(@upperbound AS varchar) + ' queryout file_' + CAST(@filecount AS varchar) + ' -w -T' SET @filecount = @filecount + 1 SET @lowerbound = @upperbound FETCH NEXT FROM boundaries INTO @upperbound END PRINT 'bcp "SELECT * FROM table WHERE key > ' + CAST(@lowerbound AS varchar) + ' queryout file_' + CAST(@filecount AS varchar) + ' -w -T' END CLOSE boundaries DEALLOCATE boundaries
-
==============================
4.내가 먼저 파일을 내 보낸 다음 외부를 나눌 것입니다. 당신이 Windows 시스템에서 실행중인 가정, 거기 몇 가지 "무료 제품"도구가 캔의 도움이있다. 추가 정보를 원하시면 수퍼 유저에이 다른 답변을 참조하십시오.
내가 먼저 파일을 내 보낸 다음 외부를 나눌 것입니다. 당신이 Windows 시스템에서 실행중인 가정, 거기 몇 가지 "무료 제품"도구가 캔의 도움이있다. 추가 정보를 원하시면 수퍼 유저에이 다른 답변을 참조하십시오.
from https://stackoverflow.com/questions/17632236/exporting-sql-server-table-to-multiple-part-files by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 엔티티 프레임 워크 5 코드 처음에 기본 키를 처리하는 방법 (0) | 2020.07.11 |
---|---|
[SQL] 어떻게 엑셀 VBA 스크립트에서 Oracle 저장 프로 시저를 호출 할 수 있습니까? (0) | 2020.07.11 |
[SQL] MySQL의에서 결과를 순위 때 어떻게 넥타이를 처리합니까? (0) | 2020.07.11 |
[SQL] SQL 서버 내부 CLR 어셈블리 C #을 (0) | 2020.07.11 |
[SQL] 어떻게 분할 문자열에 문자로 SQL 서버에서 별도의 컬럼에 (0) | 2020.07.11 |