2016-08-13 2 views
0

".dat"확장명을 가진 소스 파일을 가지고 있으며이를 SSMS의 테이블로로드하려고합니다. 아래 코드는 여기입니다 :대량 삽입 오류가 발생했습니다

하지만 다음과 같은 오류가 있습니다. 메모장에 파일을 열어서 LF 인 ROWTERMINATOR를 확인했습니다.

메시지 4866, 수준 16, 상태 8, 줄 34 대량로드에 실패했습니다. 열이 1 행 25 열의 데이터 파일에서 너무 깁니다. 필드 종결 자 및 행 종결자가 올바르게 지정되었는지 확인하십시오. 메시지 7301, 수준 16, 상태 2, 수준 16, 연결된 서버 "(null)"의 OLE DB 공급자 "BULK"에서 필요한 인터페이스 ("IID_IColumnsInfo")를 가져올 수 없습니다.

코드 : 아래

USE myDB 
GO 
CREATE TABLE [dbo].[myTable] 

(
Column1 NVARCHAR(255) NULL, 
Column2 NVARCHAR(255) NULL, 
Column3 NVARCHAR(100) NULL, 
Column4 NVARCHAR(255) NULL, 
Column5 NVARCHAR(255) NULL, 
Column6 NVARCHAR(255) NULL, 
Column7 NVARCHAR(255) NULL, 
Column8 NVARCHAR(255) NULL, 
Column9 NVARCHAR(255) NULL, 
Column10 NVARCHAR(255) NULL, 
Column11 NVARCHAR(255) NULL, 
Column12 NVARCHAR(255) NULL, 
Column13 NVARCHAR(255) NULL, 
Column14 NVARCHAR(255) NULL, 
Column15 NVARCHAR(255) NULL, 
Column16 NVARCHAR(255) NULL, 
Column17 NVARCHAR(255) NULL, 
Column18 NVARCHAR(255) NULL, 
Column19 NVARCHAR(255) NULL, 
Column20 NVARCHAR(255) NULL, 
Column21 NVARCHAR(255) NULL, 
Column22 NVARCHAR(255) NULL, 
Column23 NVARCHAR(255) NULL, 
Column24 NVARCHAR(255) NULL, 
Column25 NVARCHAR(255) NULL 
); 

BULK 
INSERT [dbo].[myTable] 
FROM 'C:\Users\John\Documents\work\MyFile.dat' 
WITH 
(
FIRSTROW = 2, 
FIELDTERMINATOR = '\t', 
ROWTERMINATOR = '\n' 
); 
SELECT * FROM [dbo].[myTable] 

데이터의 샘플이며, 이들은 매우 SSMS가 실패한 것을 행 :

Kansas City 1 494124 20 McDonalds KANSAS CUSTOMERS 22 WYANDOTTE COUNTY 239 Wyandotte County 964 S 73RD ST KANSAS CITY KS 66111 2805 Y Y Y N N 4 D Old School Loyal N 49412401

+0

인 것처럼 보입니까? 줄 끝 글자를 확인할 수 없습니까? 그것은 cr-lf 일 것입니다. (\ r \ n) – dbmitch

+0

그렇습니다. 행 착수 기는 '\ n'인 LF이지만 '\ r \ n'도 시도했습니다. – enigma6205

+0

데이터의 샘플 행은 무엇입니까? 데이터에 몇 개의 열이 있습니까? 그것은 9보다 많거나 적습니까? – dbmitch

답변

0

먼저는 NVARCHAR에서 열 아홉에 대한 데이터 유형을 변경해야합니다 (최대) ~ ntext 사용자 데이터베이스 인증이 b ulk 삽입? 사용자가 SQL Server 로그인을 사용하면 SQL Server 프로세스 계정의 보안 프로필이 사용됩니다. SQL Server 인증을 사용하는 로그인은 데이터베이스 엔진 외부에서 인증 될 수 없습니다. 따라서 SQL Server 인증을 사용하여 로그인하여 BULK INSERT 명령을 시작하면 데이터 연결은 SQL Server 프로세스 계정 (SQL Server 데이터베이스 엔진 서비스에서 사용하는 계정)의 보안 컨텍스트를 사용하여 이루어집니다. 원본 데이터를 성공적으로 읽으려면 SQL Server 데이터베이스 엔진에서 사용하는 계정에 원본 데이터에 대한 액세스 권한을 부여해야합니다. 반대로 SQL Server 사용자가 Windows 인증을 사용하여 로그온하면 사용자는 SQL Server 프로세스의 보안 프로필에 관계없이 사용자 계정이 액세스 할 수있는 파일 만 읽을 수 있습니다.

예를 들어 Windows 인증을 사용하여 SQL Server 인스턴스에 로그인 한 사용자를 생각해보십시오. 사용자가 BULK INSERT 또는 OPENROWSET을 사용하여 데이터 파일의 데이터를 SQL Server 테이블로 가져올 수있게하려면 사용자 계정에 데이터 파일에 대한 읽기 권한이 필요합니다. SQL Server 프로세스에 파일에 대한 액세스 권한이없는 경우에도 사용자는 데이터 파일에 액세스하여 파일의 데이터를 테이블로 가져올 수 있습니다. 사용자는 SQL Server 프로세스에 파일 액세스 권한을 부여 할 필요가 없습니다.

당신이 데이터베이스 에 대량 삽입에 액세스 할 경우 DAT 파일

+0

Windows 인증을 사용하고 있으며 관리자가 있습니다. 내 서버에 대량 삽입과 같은 파일에 대한 액세스 권한이 있습니다. 원본 파일의 데이터 길이를 확인했으며 열 데이터 형식과 일치합니다 – enigma6205

+1

"중요! ntext, text 및 image 데이터 형식은 이후 버전의 SQL Server에서 제거 될 예정입니다. 새 개발 작업에서는 이러한 데이터 형식을 사용하지 마십시오. 대신 현재 nvarchar (max), varchar (max) 및 varbinary (max)를 사용하십시오. " (https://msdn.microsoft.com/en-us/library/ms187993.aspx). ** nvarchar를 ntext로 변경하지 말아야합니다. – HoneyBadger

+0

HoneyBadger, 전적으로 당신에게 동의합니다. 팁 주셔서 감사합니다. – enigma6205

1

그것은 내가 일을 일반적인 문제입니다 귀하의 데이터 타입과 DATALEN을 확인합니다. 당신이 줄 바꿈 엔딩을 가지고 있고, 논리적으로 ROWTERMINATOR = '\n'를 사용하는 경우, BCP는에 \r을 추가

대화식 bcp를 사용하여 행 종결 자로 \ n을 (줄 바꿈)를 지정하면, BCP 자동으로 접두사 \ r (캐리지 리턴) 문자로, 행 종결자가 \ r \ n이됩니다. (Source)

나는 그것이 당신의 경우에 도움이되지만 내가 ROWTERMINATOR = "0x0a"를 사용하는 경우가 완벽하게 잘 작동 확실하지 않다.귀하의 코멘트에서

편집

당신은 당신이 9 열 테이블에 25 열을 삽입하려고 말한다. 분명히 그것은 작동하지 않을 것입니다. 먼저 열 수를 수정해야합니다.

+0

아니요, 테이블 정의에 25 개의 열이 있습니다. 그는 단지 표현 일뿐입니다. 그리고 위의 코드에서 9 열은 내 실제 코드에서 실패 할 수없는 25 번째 열을 나타냅니다. – enigma6205

+0

또한 bcp 유틸리티를 사용하지 않습니다. – enigma6205

+0

실제 코드가 수정되었습니다. 업데이트 된 코드를 살펴보십시오. – enigma6205

0
승리를 위해 ROWTERMINATOR = "0x0a"

!