2016-11-21 5 views
2

내 텍스트 파일에 BULK INSERT를 사용합니다. 모든 것이 잘 작동하지만 내가 발견 한 한 가지, 최종 행의 마지막 열에 값을 제공하면 가져옵니다. 마지막 행의 최종 열 값이 비어 있으면 대상 열에서 null이 허용된다는 사실에도 불구하고 행을 무시합니다! 텍스트 파일은 여기에, 탭 구분 기호를 사용하는 마지막 행 데이터의 예는 다음과 같습니다 여기BULK INSERT 마지막 행이 누락 되었습니까?

Mike Johnson 1/29/1987 M 

가 삽입됩니다 내가 마지막 열 필드 행의 모든 ​​값을 한 경우, 예 :

Mike Johnson 1/29/1987 M test 

이것은 내 BULK 삽입 :

BULK INSERT ##TEMP_TEXT 
FROM '#uncdir#\#cffile.ServerFile#' 
WITH (
    FIELDTERMINATOR = '\t', 
    ROWTERMINATOR = '\n' 
) 

나는 \r 대신 \n을 사용하려고하지만 문제가 해결되지 않았다. 나는 또한 일부 웹 사이트를 조사했지만 해결책을 찾지 못했습니다. 이 SQL에서 수정할 수있는 뭔가 궁금하네요. 이 문제를 어떻게 해결할 수 있는지 아는 사람은 알려 주시기 바랍니다.

해결책 : 여기 ColdFusion에서 사용 방법 사람들을위한

텍스트 파일에 줄 바꿈을 추가 할 것입니다 라인이다.

exec xp_cmdshell 'echo. >> "#uncdir#\#cffile.ServerFile#"'; 

키는 coldfusion 변수 주위에 큰 따옴표를 넣어야합니다. 그렇지 않으면 코드가 작동하지 않습니다.

uncdir 코드는 여기에 있습니다 :

<cfset uncdir = createObject("java","java.net.InetAddress").getLocalHost().getHostName()/> 

cffile.ServerFile 당신은 양식에서 얻을 수 있습니다. JQuery를 사용하여 텍스트 파일을 제출했습니다. 이게 도움이 되길 바란다. 고맙습니다.

+0

'\ r \ n'을 (를) 사용해 보셨습니까? –

+0

시도했지만 오류가 발생합니다 : coldfusion.tagext.sql.QueryTag $ DatabaseQueryException : 데이터베이스 쿼리 실행 오류. –

+0

또한 rowdeterminator에 '0x0a'를 사용하려고했습니다. –

답변

3

SQL Server 2008 R2에서 문제가 재현되었습니다. 해결책은 마지막 행이 개행 문자로 끝나도록 파일에 개행 문자를 추가하는 것만 큼 간단합니다.

나는 두 개의 파일을 생성 :

CREATE TABLE #t(first_name VARCHAR(128),last_name_etc VARCHAR(128),sex CHAR(1),test VARCHAR(128)); 

BULK INSERT #t 
FROM 'C:\temp\without_newline.txt' 
WITH (
    FIELDTERMINATOR='\t', 
    ROWTERMINATOR='\n' 
); 

SELECT * FROM #t; 

TRUNCATE TABLE #t; 

BULK INSERT #t 
FROM 'C:\temp\with_newline.txt' 
WITH (
    FIELDTERMINATOR='\t', 
    ROWTERMINATOR='\n' 
); 

SELECT * FROM #t; 

DROP TABLE #t; 

결과 1 :

,536,913,632

  1. without_newline
  2. with_newline 그런 다음 다음 스크립트를 실행 10
    first_name | last_name_etc  | sex | test 
    -------------------------------------------- 
    Tom   | Jackson 2/28/1986 | M | test 
    

    결과 2 :

    first_name | last_name_etc  | sex | test 
    -------------------------------------------- 
    Tom   | Jackson 2/28/1986 | M | test 
    Mike  | Johnson 1/29/1987 | M | NULL 
    

    이 솔루션은 마지막 줄 \r\n로 종료 확인하는 것만 큼 간단합니다. 대량 삽입을 수행하기 전에 텍스트 파일을 생성하는 프로세스를 변경하거나 수동으로 수행하십시오.

    수동으로 수행하는 한 가지 방법은 대량 삽입을 수행하기 바로 전에 EXEC xp_cmdshell 'echo. >> C:\temp\without_newline.txt'을 실행하는 것입니다.

+0

마침내이 작업이 가능해지면서 새로운 라인이 추가되었으며 문제가 해결되었습니다. 이 코드를 작성하는 동안 내 마음을 가로 질러 한 가지가 있습니다. 명령 cmdshell이 ​​파일에 새로운 행을 추가합니다. 내 컴퓨터에 없으면 파일의 루트/폴더를 어떻게 찾을 수 있습니까? 다른 사용자가 자신의 파일을 업로드하려고하고 그 파일이 컴퓨터에 있다고 가정 해 봅시다. 이 경우 내가 사용하고있는 디렉토리가 다를 것이고 그 경우 문제가 될 것이다. –

+0

안녕하세요 @ 에스 프레소 커피. 나는 내가 잘 따르지 않는다고 완전히 확신하지 못한다. 벌크 삽입 명령에서'data_file'에 대한 "감지"는 없습니다. [documentation] (https://msdn.microsoft.com/en-us/library/ms188365.aspx#Anchor_1)은 다음과 같이 말합니다 : ""data_file은 SQL Server가 실행되고있는 서버의 유효한 경로를 지정해야합니다. * * data_file이 원격 파일이면 ** UNC (Universal Naming Convention) 이름 **. "*을 지정하십시오. SQL Server 계정에 쓰기 액세스 권한이 없어도 가능합니다. 이 경우에는 할 수있는 일이 많지 않습니다. 아마도 계정에 쓰기 권한이있는 파일을 복사 할 것입니까? –

+0

@espresso_coffee 데이터 파일을 생성하는 프로세스에 종료 줄 바꿈을 사용하여 생성하는 것이 더 좋습니다. –