使用SQL Server 2012,我使用BULK INSERT将文本文件导入临时表:
BULK INSERT #temp
FROM 'filepath\mydata.txt'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n',
KEEPNULLS
)
我创建的#temp
表在数据类型上有所不同,包括float,nvarchar和datetime。
我的问题是我的数据有多种方法可以命名NULL值,包括DNE
,#N/A
,NA
等。非字符列中存在这些值会导致这种情况我尝试运行上面的代码时出错:
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 393, column 1 (Id)
我想知道是否有一种方法可以在表中指定一组值(DNE
,#N/A
,NA
等),以便在导入时自动被视为NULL。 / p>
答案 0 :(得分:1)
您是否尝试过此选项,
选项1: 您应该使用C#代码或任何语言代码清理数据输入,并在批量插入之前使数据清洁。
选项2: 您有批量插入选项中的约束,可以使用这些约束检查数据并根据表要求进行修改,然后可以将修改后的数据导入批量插入操作。
导入使用科学记数法的数值的示例 此示例使用下表:
CREATE TABLE t_float(c1 float, c2 decimal (5,4));
用户希望将数据批量导入t_float表。数据文件
C:\t_float-c.dat
,包含科学记数法浮点数据。例如:
8.0000000000000002E-28.0000000000000002E-2
但是,BULK INSERT无法将此数据直接导入t_float,因为它的第二列c2使用十进制数据类型。因此,格式文件是必需的。格式文件必须将科学记数法浮点数据映射到列c2的十进制格式。 以下格式文件使用SQLFLT8数据类型将第二个数据字段映射到第二列: 要使用此格式文件(使用文件名C:\ t_floatformat-c-xml.xml)将测试数据导入测试表,请发出以下Transact-SQL
<强>语句:强>
BULK INSERT bulktest..t_float
FROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');
GO
选项3: 您可以将值设为nVarchar并导入到表中,然后再次使用Cursor遍历表,然后转换值[这不是优化方式,这可能需要一些时间,但在某些情况下基于数据这也可以帮助]