多条数据插入多张表 事务

时间:2022-01-24 23:33:29
例如:有表A(学生表)
          B(成绩表)
其中A表中ID为主键关联B表MAINID
通过程序,向A表中插入(1,'张三')循环向B表插入(1,'语文','70')(1,'数学,'80')(1,'物理,'90')
如果任何一次出现异常,则回滚。

9 个解决方案

#1





use tempdb
go

declare @A table
(
id int,
name nvarchar(50)
)
declare @B table
(
mainID int,
major nvarchar(10),
score real
)

begin transaction tran1 --事务一演示插入一条学生record及对应的成绩信息
insert into @A values(1,'张三')
if @@ROWCOUNT=0
  rollback transaction tran1
insert into @B
select 1,'语文',70
union
select 1,'数学',80
union
select 1,'物理',90
if @@ROWCOUNT=0
rollback transaction tran1
commit transaction tran1 --提交事务


select a.*,b.* 
  from @A a
  join @B b on a.id=b.mainID



程序里面也有事务处理机制,看楼主是把事务处理放在application里面还是database里面了。

#2




use tempdb
go

declare @A table
(
id int,
name nvarchar(50)
)
declare @B table
(
mainID int,
major nvarchar(10),
score real
)

begin transaction tran1 --事务一演示插入一条学生record及对应的成绩信息

begin try
insert into @A values(1,'张三')
insert into @B
select 1,'语文',70
union
select 1,'数学',80
union
select 1,'物理',90

commit transaction tran1 --提交事务
end try
begin catch
rollback transaction tran1
end catch

select a.*,b.* 
  from @A a
  join @B b on a.id=b.mainID


修改一下代码,还是使用try...catch保险些

#3


+1
引用 2 楼 kensouterry 的回复:
SQL code



use tempdb
go

declare @A table
(
    id int,
    name nvarchar(50)
)
declare @B table
(
    mainID int,
    major nvarchar(10),
    score real
)

begin transaction tran……

#4



SET XACT_ABORT ON

begin tran
    insert into A 
    select 1,'张三'

    insert into B
    select 1,'语文',70
    union all
    select 1,'数学',80
    union all
    select 1,'物理',90

commit tran

#5


路过,学习

#6


可能我表述的不清楚
我意思是:
新建一个学生 张三
同时把张三的成绩记录下来,
张三的成绩可能是只有一个语文分数,也可能是十几门科目成绩
如:语文 60分;数学70分;英语80分;物理90分。。。。等等
我想在数据库中使用事务
程序中思路是
事务
插入表A张三取ID
循环读取程序
插入B表科目成绩MAINID=A.ID 科目 成绩
如果出错 事务回滚
事务结束

#7


循环向B表插入??

那要插入多少次呢?

#8


又没区别的,总之都在begin tran和commit tran之间
中间写你的逻辑,要写什么随你,跟我们又不搭嘎的
引用 6 楼 shenshan 的回复:
可能我表述的不清楚
我意思是:
新建一个学生 张三
同时把张三的成绩记录下来,
张三的成绩可能是只有一个语文分数,也可能是十几门科目成绩
如:语文 60分;数学70分;英语80分;物理90分。。。。等等
我想在数据库中使用事务
程序中思路是
事务
插入表A张三取ID
循环读取程序
插入B表科目成绩MAINID=A.ID 科目 成绩
如果出错 事务回滚
事务结束

#9



SET XACT_ABORT ON

declare @id int

begin tran
    insert into A 
    output inserted.id into #t
    select 1,'张三'
    
    select @id=ID from #t

    insert into B
    select @id,'语文',70
    union all
    select @id,'数学',80
    union all
    select @id,'物理',90
commit tran

#1





use tempdb
go

declare @A table
(
id int,
name nvarchar(50)
)
declare @B table
(
mainID int,
major nvarchar(10),
score real
)

begin transaction tran1 --事务一演示插入一条学生record及对应的成绩信息
insert into @A values(1,'张三')
if @@ROWCOUNT=0
  rollback transaction tran1
insert into @B
select 1,'语文',70
union
select 1,'数学',80
union
select 1,'物理',90
if @@ROWCOUNT=0
rollback transaction tran1
commit transaction tran1 --提交事务


select a.*,b.* 
  from @A a
  join @B b on a.id=b.mainID



程序里面也有事务处理机制,看楼主是把事务处理放在application里面还是database里面了。

#2




use tempdb
go

declare @A table
(
id int,
name nvarchar(50)
)
declare @B table
(
mainID int,
major nvarchar(10),
score real
)

begin transaction tran1 --事务一演示插入一条学生record及对应的成绩信息

begin try
insert into @A values(1,'张三')
insert into @B
select 1,'语文',70
union
select 1,'数学',80
union
select 1,'物理',90

commit transaction tran1 --提交事务
end try
begin catch
rollback transaction tran1
end catch

select a.*,b.* 
  from @A a
  join @B b on a.id=b.mainID


修改一下代码,还是使用try...catch保险些

#3


+1
引用 2 楼 kensouterry 的回复:
SQL code



use tempdb
go

declare @A table
(
    id int,
    name nvarchar(50)
)
declare @B table
(
    mainID int,
    major nvarchar(10),
    score real
)

begin transaction tran……

#4



SET XACT_ABORT ON

begin tran
    insert into A 
    select 1,'张三'

    insert into B
    select 1,'语文',70
    union all
    select 1,'数学',80
    union all
    select 1,'物理',90

commit tran

#5


路过,学习

#6


可能我表述的不清楚
我意思是:
新建一个学生 张三
同时把张三的成绩记录下来,
张三的成绩可能是只有一个语文分数,也可能是十几门科目成绩
如:语文 60分;数学70分;英语80分;物理90分。。。。等等
我想在数据库中使用事务
程序中思路是
事务
插入表A张三取ID
循环读取程序
插入B表科目成绩MAINID=A.ID 科目 成绩
如果出错 事务回滚
事务结束

#7


循环向B表插入??

那要插入多少次呢?

#8


又没区别的,总之都在begin tran和commit tran之间
中间写你的逻辑,要写什么随你,跟我们又不搭嘎的
引用 6 楼 shenshan 的回复:
可能我表述的不清楚
我意思是:
新建一个学生 张三
同时把张三的成绩记录下来,
张三的成绩可能是只有一个语文分数,也可能是十几门科目成绩
如:语文 60分;数学70分;英语80分;物理90分。。。。等等
我想在数据库中使用事务
程序中思路是
事务
插入表A张三取ID
循环读取程序
插入B表科目成绩MAINID=A.ID 科目 成绩
如果出错 事务回滚
事务结束

#9



SET XACT_ABORT ON

declare @id int

begin tran
    insert into A 
    output inserted.id into #t
    select 1,'张三'
    
    select @id=ID from #t

    insert into B
    select @id,'语文',70
    union all
    select @id,'数学',80
    union all
    select @id,'物理',90
commit tran