2009-05-29 8 views
5

Tôi có tệp csv và tôi cần nhập tệp đó vào bảng trong sql 2005 hoặc 2008. Tên cột và số đếm trong csv khác với tên cột của bảng và đếm. Các csv được chia nhỏ bởi một ';' .Sử dụng bcp để nhập tệp csv vào sql 2005 hoặc 2008

Ví dụ

FILEcontents CSV:

FirstName;LastName;Country;Age 
Roger;Mouthout;Belgium;55 

SQL Person Bảng

Columns: FName,LName,Country 
+0

Bạn đã xem bcp.exe chưa? – gbn

+0

Thế giới tạo tệp này thành tệp CSV (Giá trị được phân tách bằng dấu phẩy) là gì? –

Trả lời

9

Tôi muốn tạo ra một bảng tạm thời, số lượng lớn chèn lô, chọn vào bảng mới gì bạn cần và thả bảng tạm thời.

Something như

CREATE TABLE dbo.TempImport 
(
    FirstName varchar(255), 
    LastName varchar(255), 
    Country varchar(255), 
    Age varchar(255) 
) 
GO 
BULK INSERT dbo.TempImport FROM 'PathToMyTextFile' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n') 
GO 
INSERT INTO dbo.ExistingTable 
(
    FName, 
    LName, 
    Country 
) 
SELECT FirstName, 
     LastName, 
     Country 
FROM  dbo.TempImport 
GO 
DROP TABLE dbo.TempImport 
GO 
+6

Tiêu đề câu hỏi là cách sử dụng công cụ BCP, không chèn số lượng lớn, mặc dù đây có thể là câu trả lời đúng cho hầu hết các trường hợp, chèn hàng loạt thể hiện một số hạn chế về số hàng và trường mà công cụ bcp không. – bpatrao

+0

Mặc dù đây rõ ràng là một số thời gian trước đây, tiêu đề câu hỏi có thể đề cập đến bcp nhưng nội dung câu hỏi chỉ đơn giản là hỏi cách nhập nó và thứ hai không có giới hạn hàng hoặc trường trong BULK INSERT không tồn tại trong BCP afaik –

+0

Hi Dan ! Nếu bạn kiểm tra tài liệu chính thức của Microsoft (http://msdn.microsoft.com/en-us/library/ms188365.aspx), nó nêu rõ "Khi sử dụng tệp định dạng có BULK INSERT, bạn có thể chỉ định tối đa 1024 trường. Điều này giống như số cột tối đa được cho phép trong một bảng Nếu bạn sử dụng BULK INSERT với một tệp dữ liệu chứa hơn 1024 trường, BULK INSERT tạo lỗi 4822. Tiện ích bcp không có giới hạn này, vì vậy đối với tệp dữ liệu có chứa hơn 1024 trường, sử dụng lệnh bcp. ". Tôi hiểu đây là một vấn đề nhỏ, nhưng chỉ để giữ cho tất cả mọi người thông báo :) – bpatrao

8

Bạn có thể sử dụng một định dạng tập tin khi nhập với BCP:

Tạo một file định dạng cho bạn bảng:

bcp [table_name] format nul -f [format_file_name.fmt] -c -T 



9.0 
4 
1  SQLCHAR  0  100  ","  1  FName    SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR  0  100  ","  2  LName    SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR  0  100  ","  3  Country   SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR  0  100  "\r\n" 0  Age    SQL_Latin1_General_CP1_CI_AS 

Chỉnh sửa tệp nhập. Bí quyết là thêm hàng giả cho trường bạn muốn bỏ qua và thêm '0' làm thứ tự cột máy chủ.

Sau đó nhập dữ liệu sử dụng tập tin định dạng này, quy định cụ thể inputfile bạn, điều này tập tin định dạng và seperator:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 
3

bây giờ tôi thích sử dụng file định dạng XML như thế này với số lượng lớn chèn hoặc OPENROWSET:

<?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="|" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="37"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="41"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="17"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="i" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="2" NAME="j" xsi:type="SQLUNIQUEID"/> 
    <COLUMN SOURCE="3" NAME="k" xsi:type="SQLNUMERIC" PRECISION="18" SCALE="0"/> 
    <COLUMN SOURCE="4" NAME="l" xsi:type="SQLBINARY"/> 
    <COLUMN SOURCE="5" NAME="m" xsi:type="SQLVARYCHAR"/> 
</ROW> 
</BCPFORMAT> 

Sau đó, bạn có thể sử dụng số lượng lớn lệnh server-side INSERT như sau:

BULK INSERT foo FROM '\\mydomain.com\bar\bletch' WITH (FORMATFILE='foo.xml', ERRORFILE='foo.errors', FIRSTROW = 1, BATCHSIZE=10000) 

cách khác, nếu bạn muốn sửa đổi dữ liệu 'đang bay', bạn có thể sử dụng

INSERT foo(i, j,k) 
SELECT foo_delimited.i, foo_delimited.j, foo_delimited.k * 2 
OPENROWSET(BULK 'foo', 
        FORMATFILE= 'foo.xml') 
     AS foo_delimited 
+0

Tôi dường như không thể lấy XML để hiển thị chính xác. Người ta có thể thấy XML thô nếu bạn chỉnh sửa câu trả lời :-( –