2016-07-06 81 views
2

這裏 https://msdn.microsoft.com/en-us/library/ms188365.aspx 我可以讀到:SQL Server BULK INSERT:爲什麼「FIRSTROW屬性不打算跳過列標題」?

的FIRSTROW屬性不打算跳過列標題。 BULK INSERT語句不支持跳過標頭。當 跳過行時,SQL Server數據庫引擎只會查看字段 終止符,並且不會驗證跳過的 行的字段中的數據。

但我想這樣做。爲什麼不是這個意圖?當我跳過FIRSTROW = 2的標頭時,我能期待什麼問題嗎?

回答

2

的SQL Server數據庫引擎看起來只在現場端接

這你的答案。如果您的列標題的名稱包含字段終止符,則系統會在第一行中找到錯誤的字段數量,因此會出現極大的歡鬧。你可以想象,在所有世界的文件中,某些列有

Years, since 1970 

作爲標題。足夠清晰的人力,但機器只有規則

如果您不知道,您的bulk insert在CSV文件的一般情況下將失敗。 CSV格式是相當可變的,並且比bulk insert可以正確解釋更復雜。具體來說,引用規則允許在數據中包含逗號。 SQL Server不會兌現報價。無論如何,它都會將逗號解釋爲分隔符。喜歡的那個男人說,

的SQL Server數據庫引擎看起來只在現場端接

+1

有我的理解正確,這個答案歸結爲「它大多數情況下,它會工作得很好,特別是與anythign一個天真的程序員會期望工作......它不會適用於每一個案例,特別是對於CSV承認的每個邊緣案例都不適用。「 – Brondahl

+0

我不敢說「大多數」CSV文件嚴格逗號分隔,沒有引號,不。如果您可以控制CSV文件的生成方式,並且可以確保不會引用報價,那麼您將擁有一種特殊類型的CSV文件,它也是一種恰好使用逗號作爲分隔符的有效文本文件。 –

2

它會正常工作,但它需要第一行是相同的格式(意味着頭部必須具有相同的FIELDTERMINATOR和ROWTERMINATOR),並且當使用firstrow = 2時,那麼將從第二行插入數據。 例如,如果我有CSV文件導入什麼,第一行是列標題,我的代碼會是這樣

BULK INSERT myTable 
FROM 'C:\myTable.csv' 
WITH 
(
    FIRSTROW = 2, 
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 
GO