T-Sql
當 FIRSTROW > 1 時文件包含逗號而不是分號時,BULK INSERT 不會失敗
我遇到了一個問題,我收到了一個應該由分號 (;) 分隔但由逗號 (,) 分隔的 CSV 文件。sqlcmd 呼叫的批量插入沒有失敗,但也沒有插入。我知道呼叫 xp_cmdshell 不是最佳做法,但請不要對此發表評論。
經過調查,我發現它只有在 FIRSTROW = 1 時才會失敗(如預期的那樣),但我需要文件內的標題。
桌子:
CREATE TABLE [dbo].[test_table]( [id] [int] NULL, [title] [varchar](10) NULL, [val] [int] NULL )
格式文件:
12.0 3 1 SQLCHAR 0 4 ";" 1 "id" "" 2 SQLCHAR 0 10 ";" 2 "title" SQL_Latin1_General_CP1_CI_AS 3 SQLCHAR 0 4 "\r\n" 3 "val" ""
數據文件:
1,first,0 2,second,2
批量插入:
DECLARE @cmd VARCHAR(4000); SET @cmd = 'sqlcmd -b -S <servername> -Q "set nocount on; set dateformat dmy; bulk insert [test_db].[dbo].[test_insert] from ''C:\temp\test_table.csv'' with ( DATAFILETYPE = ''char'', TABLOCK, MAXERRORS = 1000, FIELDTERMINATOR = '';'', ROWTERMINATOR = ''\r\n'', BATCHSIZE = 100000, FORMATFILE = ''C:\temp\test_table.txt'', FIRSTROW = 2 );"'; EXEC xp_cmdshell @cmd;
更改命令從
, FIELDTERMINATOR = '';''
到
, FIELDTERMINATOR = '',''
這應該可以解決問題
BULK INSERT [test_db].[dbo].[test_insert] FROM 'C:\temp\test_table.csv' WITH ( FORMAT = 'CSV', FIELDQUOTE = '"', FIRSTROW = 2, FIELDTERMINATOR = ',', --CSV field delimiter ROWTERMINATOR = '\n', --Use to shift the control to next row TABLOCK )
隨著 ROWTERMINATOR 的使用,<您應該嘗試一下或切換到
\r\n
似乎它的行為正確。雖然文件中沒有欄位終止符,但 BULK INSERT 將整個文件視為標題第一個欄位的數據。然後沒有任何東西可以插入。