你遇到的問題其實不是由於行終結者。我懷疑,有文件錯誤的結束一起,你也看到類似以下的東西:
Msg 4864, Level 16, State 1, Line 1
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 4 ({column_name}).
雖然我說的線以下是關於ROWTERMINATOR
仍然有效,真正的問題是由您的發言表示:
[the] table that has 7 columns. The data file only has the first 4 columns, the rest should be left NULL.
這是問題所在。當使用BULK INSERT
時,數據文件必須具有與要插入的表相同數量的字段。如果不是這種情況,那麼您必須使用FORMATFILE ='format_file_path'
選項,在這種情況下,您需要創建一個Format File並指定位置。
我想你可以逃脫更容易OPENROWSET(BULK...),這樣就可以做到以下幾點:
INSERT INTO STAGING_TABLE
SELECT *
FROM OPENROWSET(BULK 'FILE_LOCATION' ...);
但是,這並不讓你指定一個ROWTERMINATOR
不使用格式文件。因此,無論在哪種情況下都需要格式文件。
OR,你可以只導入到只有4列,然後是一個不同的臨時表:
OR,由@PhilipKelley在這個答案的評論中提到,你可以創建一個只是那些四個字段的景色,有成爲目標/目標。如果您正在執行適當的步驟以使操作被最低限度地記錄下來,則Prerequisites for Minimal Logging in Bulk Import的MSDN頁面不會以某種方式說出使用View的效果。
最有可能的\l
只是解釋爲這兩個文本字符,因此它不尊重rowterminator
當你嘗試過。
0x0A
將工作,因爲我已測試它,它的行爲如預期。你的語句應該如下所示:
BULK INSERT STAGING_TABLE
FROM 'FILE_LOCATION'
WITH (
DATAFILETYPE = 'widechar',
FIELDTERMINATOR = ',',
ROWTERMINATOR = '0x0A'
);
我既沒有在最後一行的末尾0x0A
的性格和工作都一樣的嘗試。
我然後取出從線的一個逗號之一,小於全組字段離開它,那就是當我得到了以下錯誤:
Msg 4832, Level 16, State 1, Line 2
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 2
The OLE DB provider "BULK" for linked server "(null)" reported an error. The
provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 2
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
確保所有的數據文件中的行具有所需數量的字段分隔符(在這種情況下爲,
)。你提到文件中有4列,所以每行應該是3個逗號。
謝謝,您提出的替代建議最終能夠解決我的問題。這絕對是我在數據文件和登臺表之間有不同列的事實。儘管如此,我仍然對此感到困惑,因爲還有幾個其他進程按照同樣的方式構建,並且功能正確,儘管它們的列也不匹配。 在任何情況下,這一切都奏效了。謝謝! – 2014-12-11 16:40:27
@RazzleDazzle很高興解決了它!關於其他類似的工作,你確定a)他們正在使用'BULK INSERT'而不是'OPENROWSET(BULK ...)'或'BCP.EXE',以及b)如果他們使用' BULK INSERT',他們還沒有使用格式文件?我沒有看到他們有可能在使用'BULK INSERT'的同時擁有不同數量的列和格式文件,除非這些列是IDENTITY或類似的東西(不能被插入)。 PS,你最終選擇哪個實際修補程序?只是好奇:) – 2014-12-11 16:46:48
@RazzleDazzle只是FYI:我只是在目標表中額外的列進行測試。試圖將它作爲'DATETIME NOT NULL DEFAULT(GETDATE())'和'INT NOT NULL IDENTITY(1,1)',並且由於列數不匹配而失敗。所以不知道沒有格式化文件或使用「BULK INSERT」之外的其他進程如何工作。 – 2014-12-11 16:57:31