T-Sql

當 FIRSTROW > 1 時文件包含逗號而不是分號時,BULK INSERT 不會失敗

  • March 4, 2022

我遇到了一個問題,我收到了一個應該由分號 (;) 分隔但由逗號 (,) 分隔的 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 將整個文件視為標題第一個欄位的數據。然後沒有任何東西可以插入。

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