2013-03-01 5 views
2

SQL Server의 BULK INSERT 작업으로 데이터 가져 오기를 수 백 번했지만이 번에 익숙하지 않은 오류가 발생하고 문제 해결을 시도했습니다. Google에 아무 소용이 없습니다. (가) 아래 내가 새로운 행이 줄 바꿈 문자로 표시됩니다 쉼표 deliminated 파일을 사용하는 코드이다 : 그것은 지속적으로 아직 현재 날짜와 속도와 간단한 파일에, 작동일괄 삽입 실패 "대량로드 데이터 변환 오류 (잘림)"

BULK INSERT MyTable 
FROM 'C:\myflatfile.txt' 
WITH (
    FIELDTERMINATOR = ',' 
    ,ROWTERMINATOR = '/n') 
GO 

, 그것은에 실패한 것 오류 "메시지 4863, 수준 16, 상태 1, 줄 1 행 1, 열 2 (ColumnTwo)에 대한 대량로드 데이터 변환 오류 (잘림)." 파일을 보면이 오류가 발생하지 않는 이유는 알 수 없습니다 (대개 Google의 문제 해결은 구분 기호가 여러 줄로 여러 번 나타날 수 있음을 나타내므로이 오류가 발생합니다). 파일에서, 여기 처음 10 선입니다 (그것이 첫 번째 줄에 실패 참고) :

1961-01-01,8.2 
1961-02-01,8.2 
1961-03-01,7.4 
1961-04-01,7.6 
1961-05-01,7.8 
1961-06-01,8.5 
1961-07-01,9.1 
1961-08-01,8.8 
1961-09-01,8.4 
1961-10-01,8.8 

표를 thare이 VARCHAR(50) 두 개의 필드가 있습니다에 나는 심지어 내가 처음봤을 때 불구하고, 이러한 데이터를 삽입하는거야 잘라내기를 사용하여 데이터 필드를 VARCHAR(2000)으로 확장했는데 영향을 미치지 않았습니다.

CREATE TABLE MyTable (
    ColumnOne VARCHAR(50), 
    ColumnTwo VARCHAR(50) 
) 

나는 또한 그 (나는이 같은 코드를 사용하여 대시 데이터 가져 오기 많이 해봤하고 오류없이 작동하더라도) 일을 망치는 경우 모두 볼 수 있도록 대시를 제거했는데, 그것은 여전히 ​​받아 동일한 오류 메시지.

SSIS와 마찬가지로 직접 가져 오기 (Tasks 통해)가 작동하지만이 코드는 정확히 똑같은 작업을 수행해야하므로 실패합니다.

답변

11

문제는 파일 형식으로 인해 행 종결자가 작동하지 않는 것일 수 있습니다.

시도 :

ROWTERMINATOR = '0x0a' 

편집

사실

난 그냥 당신이 앞으로 사용 슬래시는 백 슬래시해야한다, 그래서이 작동하지 않을 수 있습니다주의 사항 : SQL Server 관리 Studio에서

ROWTERMINATOR = '\n' 
+0

감사합니다. 새 줄 문자 인 것처럼 파일이 '/ n'또는 '0x0a'인지 구분할 수 있습니까? 나는 이것 전에 이것을 보지 못했다. – Tim

+0

파일이 UNIX 기반 시스템 인 경우 '0x0a'를 사용해야합니다 (UNIX는 \ n - 라인 피드를 종결 자로 만 사용하기 때문에). 파일이 Windows 기반 일 경우 벌크 카피는 \ n \ (캐리지 리턴과 줄 바꿈 모두) 만 지정하더라도 실제로 \ r \ n을 사용합니다. – EkoostikMartin

2

(SSMS), 유닉스 스타일 파일의 경우 ROWTERMINATOR = '0x0a'가 작동합니다. 그러나 ROWTERMINATOR = '\ n'은 SSMS가 \ n을 Windows 스타일의 줄 끝 (\ r \ n)으로 해석하고 사용자를 대신하여 수정/중단하므로 분명하지 않습니다.

흥미롭게도 SQL 코드의 JDBC 드라이버를 통해 Java 코드에서 동일한 ROWTERMINATOR = '\ n'을 보내면 중간에 아무것도 추가로 throw되지 않으므로 Unix 스타일의 줄 끝으로 표시됩니다. \아르 자형.

그래서, 당신은 두 가지를 할 필요가 :

1 - 당신은 당신의 데이터 파일이 실제로 끝 (end-of-line)을 수행하는 방법을 알고 있어야합니다.

2 - SQL Server에 BULK INSERT SQL을 전달하는 방법이 이스케이프 시퀀스를 해석하는 방법을 이해했는지 확인하십시오. 내 제한된 경험은 SQL Server SQL에 대해 16 진수 ('0x0a')를 사용하면 모든 환경에서 작동한다는 것입니다.