SQL Server JDBC 대량 복사 API를 사용하는 방법

azure-sql-database bulkinsert java jdbc sqlbulkcopy

문제

SQL Server 대량 복사 API 및 SQLServerBulkCSVFileRecord 사용하여 열 메타 데이터를 매핑하려고 할 때 몇 가지 문제가 발생합니다. 테스트 목적으로 만 nvarchar(500) 열로 구성된 테이블을 만들고 다음과 같은 메타 데이터를 추가합니다.

fileRecord = new SQLServerBulkCSVFileRecord(csvPath, false);      

for(int i=1; i<=colCount; i++) {
    fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 500, 0);
} 

JDBC를 사용하여 Microsoft SQL 대량 복사 API를 사용한 후 다음 스택 추적을 얻었으며 SQLServerBulkCSVFileRecord 대한 설명서를 찾을 수 없습니다. 나는의 매개 변수 모르는 addColumnMetaData 스탠드 : 난 그냥보고 된 것으로 간주 됨 (?) 첫 번째 매개 변수는 분명히 다음 열 인덱스 및 데이터 타입, 컬럼의 네 번째 존재의 바이트 수에 대한 세 번째를 의미하는 것이 예 .

com.microsoft.sqlserver.jdbc.SQLServerException: Unicode data is odd byte size for column 1. Should be even byte size.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:217)
    at com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(tdsparser.java:251)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:81)
    at com.microsoft.sqlserver.jdbc.TDSParser.parse(tdsparser.java:36)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.doInsertBulk(SQLServerBulkCopy.java:1433)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.access$200(SQLServerBulkCopy.java:41)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy$1InsertBulk.doExecute(SQLServerBulkCopy.java:666)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:6276)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1793)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.sendBulkLoadBCP(SQLServerBulkCopy.java:699)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:1516)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:616)

빈 줄, CRLF가 아닌 줄 끝, 인코딩 등은 영향을 미칠 수 있지만 그 옵션을 다 써 버린 것처럼 느껴집니다.

마지막으로 여기 내 CSV 파일의 작은 샘플이 있습니다.

column1|test|1|testtest|test3
column2|test|2|testt46426est|test346
column3|test|3|test4test|test3426234

수락 된 답변

파이프 문자를 필드 구분 기호로 지정하지 않습니다. "\\|" 로 이스케이프 처리해야합니다. 왜냐하면, 문서 에 따르면 :

CSV 파일에 대해 지정된 구분 기호는 데이터의 아무 곳에 나 나타나서는 안되며 Java 정규식에서 제한된 문자 인 경우 올바르게 이스케이프해야합니다.

방금 다음 코드를 시도하고 그것은 나를 위해 일했다 :

String csvPath = "C:/Users/Gord/Desktop/sample.txt";
SQLServerBulkCSVFileRecord fileRecord = 
        new SQLServerBulkCSVFileRecord(csvPath, null, "\\|", false);

int colCount = 5;
for (int i = 1; i <= colCount; i++) {
    fileRecord.addColumnMetadata(i, null, java.sql.Types.NVARCHAR, 50, 0);
}

try (SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(conn)) {
    bulkCopy.setDestinationTableName("dbo.so41144967");

    try {
        // Write from the source to the destination.
        bulkCopy.writeToServer(fileRecord);
    } catch (Exception e) {
        // Handle any errors that may have occurred.
        e.printStackTrace();
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.