Sql-Server

SQL Server BULK IMPORT 截斷錯誤

  • October 21, 2020

我正在嘗試將一個簡單CSV文件導入 SQL Server 2017 上的表中。CSV 文件和表在列數和數據類型方面相互匹配。這是CSV文件的摘錄:

UID,customerID,DateT,TypeID,AssociatedID,AttributeID,LandingPage,jsonT,ClientIPAddress
9150,2345,2020-09-01T00:00:36Z,1,,859,campaign01.html,{'product': 'string01', 'type': '', 'string011'},192.168.200.2
9151,2356,2020-09-01T00:02:30Z,1,,640,campaign02.html,{'product': 'string02', 'type': '', 'string022'},192.168.200.1

這是我的桌子:

CREATE TABLE [dbo].[activity](
   [UID] [bigint] NOT NULL,
   [customerID] [bigint] NOT NULL,
   [DateT] [datetime] NULL,
   [TypeID] [bigint] NULL,
   [AssociatedID] [float] NULL,
   [AttributeID] [bigint] NULL,
   [LandingPage] [varchar](256) NULL,
   [jsonT] [varchar](1024) NULL,
   [ClientIPAddress] [varchar](64) NULL,
)
GO

這是我的導入聲明:

BULK INSERT dbo.activity
FROM 'C:\tmp\activity.csv'
WITH (
   FIRSTROW = 2,
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '0x0a',
   BATCHSIZE = 1000,
   MAXERRORS = 2
)
GO

我不斷收到一條錯誤消息,說要截斷最後一列(客戶端 IP)。我檢查了所有值,它們只有 IP。此外,錯誤並非在所有行上,我一生都看不到一種 IP 格式或另一種 IP 格式之間的任何區別,它們只是 IP!我嘗試簡單地使 ClientIPAddress 欄位更大(只是為了它),但我只是不斷收到相同的錯誤。

Msg 4863, Level 16, State 1, Line 1
Bulk load data conversion error (truncation) for row 2, column 9 (ClientIPAddress).
Msg 4863, Level 16, State 1, Line 1
Bulk load data conversion error (truncation) for row 5, column 9 (ClientIPAddress).
Msg 4863, Level 16, State 1, Line 1
Bulk load data conversion error (truncation) for row 6, column 9 (ClientIPAddress).
Msg 4865, Level 16, State 1, Line 1
Cannot bulk load because the maximum number of errors (2) was exceeded.
Msg 7399, Level 16, State 1, Line 1
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 1
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

任何關於我可以檢查什麼或我做錯了什麼的想法都將受到高度讚賞。

謝謝!

使用您的範例數據導入對我有用。但是,如果真實數據在那個“jsonT”列中有逗號,那麼它將在錯誤的列中獲取數據。BULK INSERT 將該逗號解釋為 CSV 格式的一部分,然後開始將其後的所有內容放在最後一列 ( ClientIPAddress) 中:

錯誤結果截圖

如果您可以控製文件的創建,則可以使用不同的FIELDTERMINATOR,例如管道 ( |)。根據文件,您需要選擇一些您確定不會出現在源數據中的內容:

要用作批量導入的數據文件,CSV 文件必須符合以下限制:

  • 數據欄位從不包含欄位終止符。
  • 數據欄位中的任何值或所有值都用引號 ("") 括起來。
UID|customerID|DateT|TypeID|AssociatedID|AttributeID|LandingPage|jsonT|ClientIPAddress
9150|2345|2020-09-01T00:00:36Z|1||859|campaign01.html|{'product': 'string01', 'type': '', 'string011'}|192.168.200.2
9151|2356|2020-09-01T00:02:30Z|1||640|campaign02.html|{'product': 'string02', 'type': '', 'string022'}|192.168.200.1

然後你的BULK INSERT陳述看起來像這樣:

BULK INSERT dbo.activity
FROM 'C:\temp\activity.csv'
WITH (
   FIRSTROW = 2,
   FIELDTERMINATOR = '|',
   ROWTERMINATOR = '0x0a',
   BATCHSIZE = 1000,
   MAXERRORS = 2
);

顯示正確結果的螢幕截圖

如果您無法控制導出文件的創建,很遺憾您需要:

  • 對其進行一些自定義預處理以便能夠使用它BULK INSERT
  • 使用不同的進口技術

引用自:https://dba.stackexchange.com/questions/278446