2011-12-16 29 views
6

Tôi đang cố chèn một số dữ liệu vào bảng từ tài liệu csv có tất cả các trường được phân tách bằng ""Sql Bulk chèn tệp định dạng XML với dấu nháy kép trong terminator

tức là.

APPLICANTID,NAME,CONTACT,PHONENO,MOBILENO,FAXNO,EMAIL,ADDR1,ADDR2,ADDR3,STATE,POSTCODE 
"3","Snoop Dogg","Snoop Dogg","411","","","","411 High Street","USA 
","","USA", "1111" "4","LL Cool J","LL Cool J","","","","","5 King 
Street","","","USA","1111" 

Tôi đang sử dụng một tập tin định dạng xml để cố gắng và vượt qua "the" delimiters như tôi tin rằng tôi sẽ phải cập nhật các dữ liệu một lần nữa sau khi nhập để loại bỏ các inital "nếu nó không.

My tập tin định dạng trông giống như sau:

<?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="NCharTerm" TERMINATOR='",' MAX_LENGTH="12"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="9" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="10" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="11" xsi:type="CharTerm" TERMINATOR=',"' COLLATION="Latin1_General_CI_AS"/> 
    <FIELD ID="12" xsi:type="CharTerm" TERMINATOR="\r\n" COLLATION="Latin1_General_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="APPLICANTID" xsi:type="SQLINT"/> 
    <COLUMN SOURCE="2" NAME="NAME" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="CONTACT" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="4" NAME="PHONENO" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="5" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="6" NAME="FAXNO" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="7" NAME="EMAIL" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="8" NAME="ADDR1" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="9" NAME="ADDR2" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="10" NAME="ADDR3" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="11" NAME="STATE" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="12" NAME="POSTCODE" xsi:type="SQLCHAR"/> 
</ROW> 
</BCPFORMAT> 

và tôi chạy việc nhập khẩu như sau:

BULK INSERT [PracticalDB].dbo.applicant 
FROM 'C:\temp.csv' 
WITH (KEEPIDENTITY, FORMATFILE='C:\temp.xml', FIRSTROW = 2) 

Tôi gặp lỗi:

Msg 4864, Level 16, State 1, Line 1 Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 2, column 1 (APPLICANTID).

cho tất cả các hàng.

Tôi đã cố gắng kết hợp khác nhau khác nhau cho các terminator bao gồm sử dụng:

TERMINATOR="&quot;," 
TERMINATOR="\"," 
TERMINATOR='"," 
TERMINATOR='\"," 

và không ai trong số họ có vẻ làm việc.

Có một cách chính xác để thoát khỏi "để nó sẽ được phân tích một cách chính xác, giả định rằng đó là vấn đề của tôi ở đây.

Trả lời

15

Ok vì vậy tôi figured it out!

Bạn có thể sử dụng 'thay vì "khi bạn xác định các thuộc tính xml tức là TERMINATOR = '', thì bạn có thể sử dụng" bên trong chúng mà không đáng lo ngại.

Ngoài ra tôi cần phải ăn đầu tiên "với một trường để các cột khác có thể được phân tích cú pháp chính xác. Đây đã kết thúc với các tập tin định dạng

<?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="CharTerm" TERMINATOR='"' /> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="6" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="7" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="9" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="10" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="11" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="12" xsi:type="CharTerm" TERMINATOR='","' /> 
    <FIELD ID="13" xsi:type="CharTerm" TERMINATOR='"\r\n' /> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="2" NAME="APPLICANTID" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="3" NAME="NAME" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="4" NAME="CONTACT" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="5" NAME="PHONENO" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="6" NAME="MOBILENO" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="7" NAME="FAXNO" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="8" NAME="EMAIL" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="9" NAME="ADDR1" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="10" NAME="ADDR2" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="11" NAME="ADDR3" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="12" NAME="STATE" xsi:type="SQLNVARCHAR"/> 
    <COLUMN SOURCE="13" NAME="POSTCODE" xsi:type="SQLCHAR"/> 
</ROW> 
</BCPFORMAT> 

đâu trường đầu tiên chỉ là một ném đi một để loại bỏ các đầu tiên "và các lĩnh vực khác đều tách trên", "và tách cuối cùng về" (newline)

+0

Cảm ơn!Đây là giải pháp tốt nhất tôi đã tìm thấy một vấn đề rất phổ biến. Tôi đã tạo một tệp xml tương tự để nhập và nó hoạt động hoàn hảo. –

2

Mẹo: nếu chỉ một số trường được doubleqouted, sau đó sử dụng openrowset phiên bản chèn số lượng lớn, và làm như vậy, bạn có thể thao tác nội dung trường đến từ tệp đầu vào trước khi chèn vào bảng mục tiêu.

Trong thao tác, bạn có thể làm bất cứ điều gì với nội dung của trường, ví dụ: loại bỏ dấu ngoặc kép. Ảnh hưởng đến hiệu suất không được đề cập ở đây, tôi không có biện pháp nào về vấn đề này.

1

Mẹo: nếu tệp CSV của bạn không có định dạng nhất quán, ví dụ: ON THE COLUMN CÙNG một số giá trị được tăng gấp đôi và một số không phải blog này sẽ giúp bạn thực hiện nó một cách dễ dàng (đây là tiếp tục tip Estevez như sử dụng openrowset chỉ là bước cuối cùng) http://ariely.info/Blog/tabid/83/EntryId/122/Using-Bulk-Insert-to-import-inconsistent-data-format-using-pure-T-SQL.aspx

Các vấn đề liên quan