2009-05-29 58 views
5

我有一個csv文件,我需要將它導入到sql 2005或2008中的表中。csv中的列名和計數與表列名稱不同計數。 csv被';'分割, 。使用bcp將csv文件導入到sql 2005或2008

CSV FILEcontents:

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

SQL人表

Columns: FName,LName,Country 
+0

你看過bcp.exe嗎? – gbn 2009-05-29 07:39:36

+0

這個世界是什麼使這個文件成爲一個CSV(逗號分隔值)文件? – 2017-06-15 13:45:10

回答

9

我想創建一個臨時表,批量插入很多,選擇到新表什麼你需要放下臨時表。

喜歡的東西

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

問題標題是如何使用BCP工具,而不是批量插入,儘管對於大多數情況這可能是正確的答案,批量插入對bcp工具沒有的行數和字段數量提出了一些限制。 – bpatrao 2012-03-22 17:08:19

8

與BCP導入時,您可以使用格式文件:

用於創建格式文件的表:

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 

編輯導入文件。訣竅是爲您想跳過的字段添加一個虛擬行,並添加一個'0' 作爲服務器列順序。

然後使用這種格式的文件中,並指定inputfile中,這種格式的文件和分隔符導入數據:

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

我現在更喜歡使用XML格式的文件,像這樣用BULK INSERT或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> 

然後你就可以按如下方式使用服務器端BULK INSERT命令:

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

或者,如果您要修改數據'正在進行中',則可以使用

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 
相關問題