我有一个输入的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');
您可以先插入临时表,然后验证它并插入到表中。因此,您可以插入而不会出现错误。
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