2013-06-18 36 views
2

我有一個CSV文件中的一些財務數據,我想把它放到一個SQL表中。如何在不插入自動編號列的情況下使用批量插入?

我想運行下面的腳本,我改編自這個來源:(http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/

CREATE TABLE Price 
(ID INT IDENTITY(1,1) NOT NULL, 
PriceDate datetime2, 
OpenPrice decimal(10,4), 
HighPrice decimal(10,4), 
LowPrice decimal(10,4), 
ClosePrice decimal(10,4), 
Volume int, 
AdjClose decimal(10,4), 
AdjOpen decimal(10,4), 
AdjLow decimal(10,4), 
AdjHigh decimal(10,4) 
) 
GO 


BULK 
INSERT Price 
FROM 'C:\Users\Public\Documents\bhp.csv' 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n' 
) 
GO 

我收到以下錯誤:

'Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 1 (ID).'

我認爲,這是因爲我的「ID」這是一個主鍵和一個自動編號增量。

很顯然,我不希望產生通過CSV這個數字(我打算稍後插入多個CSV文件導入此表),我希望它是由數據庫生成。

是否可以指定BULK INSERT我打算插入到每個列的列?

+0

電話試試上面的http://stackoverflow.com/questions/14711814/ignore-certain-columns-when-using-bulk-insert順便說一句,有趣的問題+1。 –

回答

1

我總是-I做 - 創建一個臨時(未索引,沒有唯一的ID,沒有主鍵,等等)表和批量插入CSV那裏,然後或者將數據移動到目標表或改變表以使它看起來如我所願。
原因是,在某些情況下,格式設置可能很複雜,並且它只是另一個錯誤來源,更容易過濾像字段NOT NULL這樣的問題,但CSV中有一個錯誤,etc。一個也可以觸發更新數據,如果它不是一個ASAP插入(例如索引表可以運行一整夜)
我有足夠的頭痛與CSV導入,所以...在我的經驗最好的解決方案是一個臨時表,並改變它或移動數據。但是,這是你的,當然:)

+1

啊謝謝,因爲只是使用臨時表而忽略了這樣一個明顯的解決方案。 – Diskdrive

+0

@Diskdrive不客氣。當人們發現一個問題從來沒有看到最簡單的解決方案,這是人性 - 這就是爲什麼我們有堆棧溢出;)很高興我能提供幫助。乾杯! – 2013-06-18 13:58:48

1

你可以使用一個format file指定BULK INSERT如何處理缺少的列。

你也可以創建一個臨時表,而不到該ID列和進口。然後,您可以執行任何可能需要的數據清理,並對生產表執行正常的INSERT操作。

您可以使用的另一個選項是創建一個針對您的生產表的視圖。在你的視圖定義中,你會忽略ID列。然後,您可以對視圖進行BULK INSERT。