Sql-Server
SQL Server BULK IMPORT 截斷錯誤
我正在嘗試將一個簡單
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
- 使用不同的進口技術