sql 往新表里面插入查询到的结果集,假如最后一条报错的话,前面插入的会有效吗?

时间:2022-09-16 12:08:38
insert into table1 select * from table2

类似于这样的sql语句,往table1表中插入查询到的结果集,假如查询到50条数据,前面25条数据都是插入到table1是OK的,第26条因为某个字段什么的不兼容出错了,这样的话前面25条插入的数据是存在的吗?

8 个解决方案

#1


应该是存在的 你可以去试试

#2



--批量插入一条有问题,就报错不执行了
declare @T table (id int,col varchar(1))
insert into @T
select 1,'a' union all
select 2,'b' union all
select 3,'c'

declare @M table (id varchar(4),col varchar(1))
insert into @M
select '4','e' union all
select '5','f' union all
select 'a','g'

insert into @T select * from @M

#3



declare @T table (id int,col varchar(1))
insert into @T
select 1,'a' union all
select 2,'b' union all
select 3,'c'

declare @M table (id varchar(4),col varchar(1))
insert into @M
select '4','e' union all
select '5','f' union all
select 'a','g'

--有一条错误,就整体报错,不执行
--insert into @T select * from @M 

--如果是这样的话,前面的是执行的,出错后停止
insert into @T select '4','e' --成功
insert into @T select '5','f' --成功
insert into @T select 'a','g' --失败
select * from @T

#4


至于会不会回滚
看你是不是用的是显示事务
还是隐式的
即使显示放在一个事务也要看错误的严重级别 

#5


貌似看错了
sql 往新表里面插入查询到的结果集,假如最后一条报错的话,前面插入的会有效吗?

#6


为了防止这样的问题 可以
set xact_abort ON

#7


噢噢...我那是一条sql语句,查询到的结果集可能有几万条数据,就怕插入一半成功,一半失败。

按照各位大侠的意思就是说:只有当中出现一条报错的,那么整体就报错了? 前面插入OK也会撤销?

#8


那建议你先SELECT执行下,看看查询出的结果有没有问题。如果没问题,你再INSERT INTO到另一张表比较好。

#1


应该是存在的 你可以去试试

#2



--批量插入一条有问题,就报错不执行了
declare @T table (id int,col varchar(1))
insert into @T
select 1,'a' union all
select 2,'b' union all
select 3,'c'

declare @M table (id varchar(4),col varchar(1))
insert into @M
select '4','e' union all
select '5','f' union all
select 'a','g'

insert into @T select * from @M

#3



declare @T table (id int,col varchar(1))
insert into @T
select 1,'a' union all
select 2,'b' union all
select 3,'c'

declare @M table (id varchar(4),col varchar(1))
insert into @M
select '4','e' union all
select '5','f' union all
select 'a','g'

--有一条错误,就整体报错,不执行
--insert into @T select * from @M 

--如果是这样的话,前面的是执行的,出错后停止
insert into @T select '4','e' --成功
insert into @T select '5','f' --成功
insert into @T select 'a','g' --失败
select * from @T

#4


至于会不会回滚
看你是不是用的是显示事务
还是隐式的
即使显示放在一个事务也要看错误的严重级别 

#5


貌似看错了
sql 往新表里面插入查询到的结果集,假如最后一条报错的话,前面插入的会有效吗?

#6


为了防止这样的问题 可以
set xact_abort ON

#7


噢噢...我那是一条sql语句,查询到的结果集可能有几万条数据,就怕插入一半成功,一半失败。

按照各位大侠的意思就是说:只有当中出现一条报错的,那么整体就报错了? 前面插入OK也会撤销?

#8


那建议你先SELECT执行下,看看查询出的结果有没有问题。如果没问题,你再INSERT INTO到另一张表比较好。