为SQL Server批量导入指定空字段
使用SQL Server 2012,我将使用大容量插入将文本文件导入临时表:为SQL Server批量导入指定空字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,使用SQL Server 2012,我将使用大容量插入将文本文件导入临时表: BULK INSERT #temp FROM 'filepath\mydata.txt' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n', KEEPNULLS ) 我创建的#temp表的数据类型各不相同,包括float、nvarchar和d
BULK INSERT #temp
FROM 'filepath\mydata.txt'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n',
KEEPNULLS
)
我创建的#temp
表的数据类型各不相同,包括float、nvarchar和datetime
我的问题是,我的数据有几种命名空值的方法,包括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
等),以便在导入时自动将其视为空值。是否尝试过此选项
选项1:
您应该使用C#代码或任何语言代码清理数据输入,并在大容量插入之前将数据清理干净
选项2:
在大容量插入选项中有约束,可以使用这些约束检查数据并根据表要求修改,然后可以将修改后的数据导入大容量插入操作
导入使用科学记数法的数值的示例
此示例使用下表:
CREATE TABLE t_float(c1 float, c2 decimal (5,4));
用户希望将数据批量导入t_浮点表。数据文件
C:\t\u float-C.dat
,包含科学符号float数据。例如:
8.0000000000000002E-28.0000000000000002E-2
但是,大容量插入无法将此数据直接导入t_float,因为其第二列c2使用decimal数据类型。因此,需要一个格式化文件。格式文件必须将科学符号浮点数据映射到c2列的十进制格式。
以下格式文件使用SQLFLT8数据类型将第二个数据字段映射到第二列:
要使用此格式文件(使用文件名C:\t\u 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并导入到表中,然后再次使用游标遍历表,然后转换值[这不是优化的方式,可能需要一些时间,但在某些情况下,基于数据,这也会有所帮助]在更改数据类型之前,您必须先清理字段。一种方法似乎是使用格式文件。然后可以将everything指定为varchar/nvarchar导入,然后创建代码将这些值更新为null,然后转换为所需的数据类型。