我试图创建一个新表,其中的列只是varchar(100),但它给出了相同的转换错误。该列的大部分由十进制数字组成,但是当找不到十进制时,公司将空值替换为NA,而不是将其设置为null或留空。该文件将不会批量插入,因为有时在小数列中会有大量的NA。不知道如何解决该问题。我的批量插入(再次,我尝试将varchar(100)用于字段和十进制(18,2),但得到相同的数据转换错误
Bulk Insert MyExistingTable
From '\\myfile.TXT'
With (
FIELDTERMINATOR = '|',
ROWTERMINATOR = '0x0a',
BATCHSIZE = 10000
)
例如,您成功加载了两列的csv(一列是文本,另一列是十进制数字,但有时是文字文本'NA'而不是null / empty,则可以这样移动数据:] >
INSERT INTO main(maintextcol, maindeccol) SELECT temptextcol, NULLIF(tempdeccol, 'NA') from tmp
从文本到十进制的转换是隐式的。如果您有更多列,请将它们添加到查询中(为了简化操作,我将其设置为2)
如果要避免在主表中重复,因为tmp中的某些数据已经在main中:
INSERT INTO main(maintextcol, maindeccol) SELECT t.temptextcol, NULLIF(t.tempdeccol, 'NA') FROM tmp t LEFT JOIN main m ON m.maintextcol = t.temptextcol -- the xxxtextcol columns define the ID in each table WHERE m.maintextcol is null
如果没有匹配项,则左联接将在maintextcol中创建null,因此这是我们要插入的行之一。 where子句查找这样的行
简单场景的演示:
create table main(a varchar(100), b decimal(18,2 )) GO
✓create table tmp (a varchar(100), b varchar(100)) GO
✓insert into tmp values('a', '10.1'), ('b', 'NA') GO
2行受影响insert into main select a, NULLIF(b, 'NA') from tmp GO
2行受影响select * from main GO
一个| b:-| :----一个| 10.10b | nulldb <>小提琴here