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
我试图创建一个新的 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