복붙노트

[SQL] 여러 파트 파일에 SQL 서버 테이블 내보내기

SQL

여러 파트 파일에 SQL 서버 테이블 내보내기

나는 CSV 파일로 상당히 큰 SQL Server 테이블 ~ 1백기가바이트을 보내야합니다. 그러나 출력이 하나의 CSV 파일을 할 것이 아니라, 그것은 이상적으로 여러 개의 파일 10 개 파일 각각 10 기가 바이트 말을해야합니다.

나는 BCP는 BATCH_SIZE 인수를 가지고 볼 수 있지만 이것은 여전히 ​​하나의 파일에 모든 데이터를 기록? 내가 무엇을 필요로하고 거기에 다른 무료 유틸리티가 있습니까? 어느 파일의 크기는 바이트 또는 행 수에 지정 될 수있는?

데이터가 내가 제안을 열려있어 데이터를 내보내는 더 나은 방법이 그렇다면, 하이브 / 하둡 플랫폼에서 다른 소스와 결합 될 수 있도록 상황에 맞는 비트의 경우입니다.

해결법

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

    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. ==============================

    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. ==============================

    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. ==============================

    4.내가 먼저 파일을 내 보낸 다음 외부를 나눌 것입니다. 당신이 Windows 시스템에서 실행중인 가정, 거기 ​​몇 가지 "무료 제품"도구가 캔의 도움이있다. 추가 정보를 원하시면 수퍼 유저에이 다른 답변을 참조하십시오.

    내가 먼저 파일을 내 보낸 다음 외부를 나눌 것입니다. 당신이 Windows 시스템에서 실행중인 가정, 거기 ​​몇 가지 "무료 제품"도구가 캔의 도움이있다. 추가 정보를 원하시면 수퍼 유저에이 다른 답변을 참조하십시오.

  5. from https://stackoverflow.com/questions/17632236/exporting-sql-server-table-to-multiple-part-files by cc-by-sa and MIT license