SSMS - 尝试批量插入 table 但十进制字段有时包含 NA

SSMS - Trying to Bulk insert into a table but decimal field sometimes contains NA

我试图创建一个新的 table,其中的列只是 varchar(100),但它给出了相同的转换错误。该列的大部分由十进制数字组成,但是当没有找到小数点时,公司没有输入空值或留空,而是将 NA 用于 NULL 值。 该文件不会批量插入,因为有时小数列中有大量 NA。 不知道如何解决这个问题。我的批量插入(同样,我尝试将 varchar(100) 用于字段和 decimal (18,2) 但得到相同的数据转换错误

Bulk Insert MyExistingTable
From '\myfile.TXT'
With (   
  FIELDTERMINATOR = '|',
  ROWTERMINATOR = '0x0a',
  BATCHSIZE = 10000
  )

一旦你成功加载,例如,一个 2 列的 csv(一列是文本,另一列是十进制数字,但有时是文字文本 'NA' 而不是 null/empty)你可以这样移动数据:

INSERT INTO main(maintextcol, maindeccol)
SELECT temptextcol, NULLIF(tempdeccol, 'NA') from tmp

从文本到十进制的转换是隐式的。如果您有更多列,请将它们添加到查询中(我将其设为 2 以保持简单)

如果你想避免在你的 main table 中重复,因为 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 中创建空值,因此这是我们要插入的行之一。 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 rows affected
insert into main 
select a, NULLIF(b, 'NA') from tmp
GO
2 rows affected
select * from main
GO
a  | b    
:- | :----
a  | 10.10
b  | null 

db<>fiddle here