2017-12-15 5 views
1

BULK INSERT을 사용하여 SQL Server 테이블에 많은 양의 이진 파일을 메타 데이터와 함께 삽입하려고합니다. 사용할 열의 하위 집합 만 지정하려고합니다 (가장 중요한 것은 PK는 UniqueIdentifier이고 SQL Server에서이 필드를 생성해야 함). 그래서 모델 파일을 사용해야합니다.XML 모델로 대량 삽입하지 못했습니다.

00000000-F436-49D0-B5A9-02DAB2E03F45, B, , , , JVBERio4MjEzNQ0KJSVFT0Y=, 109754, 2017-12-14 14:53:23, 2017-12-14 14:53:23, number, name 

을 그리고이 문장 :

이 파일을 잘 (모든 열에 대한 데이터를 입력) 모델 파일을 작품을 사용하지

BULK INSERT Documents 
FROM 'c:\temp\testdata.txt' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n', 
    ROWS_PER_BATCH = 1000, 
    FIRSTROW = 1, 
    TABLOCK 
) 

을하지만 모델 파일을 사용하려고 할 때, 나는 두 가지 다른 문제를 겪었다.

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="NativePrefix" PREFIX_LENGTH="1"/> 
    <FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="4" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="5" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="6" xsi:type="NCharPrefix" PREFIX_LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="7" xsi:type="NativeFixed" LENGTH="4"/> 
    <FIELD ID="8" xsi:type="NativeFixed" LENGTH="8"/> 
    <FIELD ID="9" xsi:type="NativePrefix" PREFIX_LENGTH="1"/> 
    <FIELD ID="10" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="11" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="DocumentId" xsi:type="SQLUNIQUEID"/> 
    <COLUMN SOURCE="2" NAME="DocumentType" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="CompanyCode" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="4" NAME="CustomerNumber" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="5" NAME="OrderNumber" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="6" NAME="Data" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="7" NAME="Size" xsi:type="SQLINT"/> 
    <COLUMN SOURCE="8" NAME="Created" xsi:type="SQLDATETIME"/> 
    <COLUMN SOURCE="9" NAME="Modified" xsi:type="SQLDATETIME"/> 
    <COLUMN SOURCE="10" NAME="InvoiceNumber" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="11" NAME="Title" xsi:type="SQLNVARCHAR"/> 
</ROW> 
</BCPFORMAT> 

이 문 :

BULK INSERT Documents 
    FROM 'c:\Temp\testiness.txt' 
    WITH 
    (
     FIELDTERMINATOR = ',', 
     ROWTERMINATOR = '\n', 
     ROWS_PER_BATCH = 1000, 
     FIRSTROW = 1, 
     TABLOCK, 
     FORMATFILE = 'c:\Temp\modeltest.xml' 
    ); 
GO 

내가이 오류를 얻을 : 모델 파일을 사용하는 경우 첫째, 그 모든 열을 지정

Msg 4866, Level 16, State 7, Line 1
The bulk load failed. The column is too long in the data file for row 1, column 2. Verify that the field terminator and row terminator are specified correctly.

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.

Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".`

을 그리고 (이 감소 모델 파일을 사용하는 경우 더 적은 값을 가진 atext 파일) :

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="3" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="4" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="50" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="5" xsi:type="NCharPrefix" PREFIX_LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="6" xsi:type="NativeFixed" LENGTH="4"/> 
    <FIELD ID="7" xsi:type="NativeFixed" LENGTH="8"/> 
    <FIELD ID="8" xsi:type="NativePrefix" PREFIX_LENGTH="1"/> 
    <FIELD ID="9" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="DocumentType" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="2" NAME="CompanyCode" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="CustomerNumber" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="4" NAME="OrderNumber" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="5" NAME="Data" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="6" NAME="Size" xsi:type="SQLINT"/> 
    <COLUMN SOURCE="7" NAME="Created" xsi:type="SQLDATETIME"/> 
    <COLUMN SOURCE="8" NAME="Modified" xsi:type="SQLDATETIME"/> 
    <COLUMN SOURCE="9" NAME="Title" xsi:type="SQLNVARCHAR"/> 
</ROW> 
</BCPFORMAT> 

내가 얻을 :

Msg 257, Level 16, State 3, Line 1
Implicit conversion from data type datetime to int is not allowed. Use the CONVERT function to run this query.

+1

많은 수의 파일을 SQL Server로 가져올 때마다 일반적으로 Powershell을 사용합니다. 특히 가져 오기가 하나가 아닌 경우에 특히 그렇습니다. .NET 객체를 사용하여 유효성을 검사하고 데이터를 빠르고 효율적으로 가져올 수 있습니다. –

+0

나는 powershell을 배울 시간이 있었으면 좋겠다. –

+0

매우 간단하다.이 링크를 보라 : https://gallery.technet.microsoft.com/scriptcenter/Import-Large-CSVs-into-SQL-216223d9 그리고 너 이 스크립트가 SQL 에이전트 작업 내에서 기본적으로 실행되도록 예약 할 수 있습니다. –

답변

0

나는 관대 준비 테이블에이 데이터를 가져오고 거기에서 계속하는 것이 좋습니다 것입니다. 그냥 하나 명의 관찰 :

<FIELD ID="7" xsi:type="NativeFixed" LENGTH="8"/> 
<FIELD ID="8" xsi:type="NativePrefix" PREFIX_LENGTH="1"/> 
<FIELD ID="9" xsi:type="NCharPrefix" PREFIX_LENGTH="2" MAX_LENGTH="100"> 

해당

<COLUMN SOURCE="7" NAME="Size" xsi:type="SQLINT"/> 
<COLUMN SOURCE="8" NAME="Created" xsi:type="SQLDATETIME"/> 
<COLUMN SOURCE="9" NAME="Modified" xsi:type="SQLDATETIME"/> 
수 (Nr) (7)가 INT (8 바이트 그래도 훨씬이다) 것 같다

반면, 컬럼의 이름으로 날짜 값을 8, 9 점 (그리고 형식), <FIELD> 정의가 일관성이 없습니다.

관련 문제