SSMS-试图批量插入表中,但十进制字段有时包含NA

问题描述 投票:0回答:1

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

Bulk Insert MyExistingTable
From '\\myfile.TXT'
With (   
  FIELDTERMINATOR = '|',
  ROWTERMINATOR = '0x0a',
  BATCHSIZE = 10000
  )
sql-server tsql bulkinsert
1个回答
0
投票

例如,您成功加载了两列的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 | null

db <>小提琴here

© www.soinside.com 2019 - 2024. All rights reserved.