SQL Server 2017-使用格式文件和FORMAT = CSV参数批量插入SQLBIT类型

问题描述 投票:0回答:1

我有一个输入的CSV文件。 CSV中的数据包含在文本限定符(双引号)中,因此对于批量插入以在插入表时删除双引号,我使用的是FORMAT ='CSV'参数。

CSV中的一列包含布尔数据(TRUE / FALSE),我希望将其作为1和0插入到SQL表(SQL 2017)中,其数据类型为bit。因此,在格式文件中,我已将其类型指定为SQLBIT,其他类型则指定为SQLCHAR。

但是批量插入失败,并出现错误:

Cannot bulk load CSV file. Invalid field parameters are specified for source column number 3 in the format file. All data fields must be either character or Unicode character with terminator when CSV format is specified.

从上述错误中我了解到的一件事是,当我使用FORMAT ='CSV'参数时,无法在格式文件中使用SQLBIT。使用SQLCHAR可以正常工作,但是然后在SQL表中,我必须将数据类型更改为varchar(5)而不是我不需要的位。

所以有一种方法可以在使用FORMAT ='CSV'参数的同时使用格式文件中的两个SQLBIT,或者如果不使用SQLBIT,则可以使用任何其他方法在不更改datype的情况下在SQL表中插入值1和0?

输入CSV:

Id,Address,IsActive,CreatedDate
"I1","NY,U.S.","TRUE","2020-01-01"
"I2","Perth,Aus","FALSE","2020-02-01"

SQL TABLE:

Create table dbo.Bulk_Fmt_Test
(
   Id char(2) not null,
   Address varchar(255),
   IsActive bit,
  CreatedDate datetime2
)

[格式化文件:

14.0
4
1 SQLCHAR 0 9999 "," 1 Id ""
2 SQLCHAR 0 9999 "," 2 Address ""
3 SQLBIT  0  1   "," 3 IsActive ""
4 SQLCHAR 0 9999 "\n" 4 CreatedDate ""

批量插入查询:

BULK INSERT dbo.Bulk_Fmt_Test from 'C:\Data\Sample1.csv'
WITH (FORMAT = 'CSV', FIRSTROW = 2, FormatFile = 'C:\Data\Sample.fmt');
sql-server bulkinsert
1个回答
0
投票

您可以先插入临时表,然后验证它并插入到表中。因此,您可以插入而不会出现错误。

CREATE TABLE #Bulk_Fmt_Test(
   Id varchar(100),
   Address varchar(300),
   IsActive varchar(10),
   CreatedDate varchar(20)
)

BULK INSERT #Bulk_Fmt_Test from 'C:\Data\Sample1.csv'
WITH (FORMAT = 'CSV', FIRSTROW = 2, FormatFile ='C:\Data\Sample.fmt');

INSERT INTO Bulk_Fmt_Test (Id, Address, IsActive, CreatedDate)
SELECT
TRY_CONVERT(char(2), Id),
LEFT(Address, 255),
ISNULL(TRY_CONVERT(bit, IsActive), IIF(IsActive = 'TRUE', 1, 0)),
TRY_CONVERT(datetime2, CreatedDate)
FROM #Bulk_Fmt_Test

注意:TRY_CONVERT是兼容性级别110及更高版本的保留关键字。详细信息here

© www.soinside.com 2019 - 2024. All rights reserved.