这是我的代码。这很简单:第一个INSERT
失败而后两个失败。
在我继续之前,我想澄清一点,我明白我可以插入IF statement
@@ERROR
或BEGIN ROLLBACK
来解决问题。我知道如何解决问题。
由于脚本中的两个INSERT都在BEGIN/COMMIT TRAN
之间,我认为这将被视为单个事务。所以在我的情况下,由于第一个INSERT
失败,我假设以下INSERT
将不会执行或不会被提交。似乎情况并非如此。
BEGIN TRAN
和COMMIT TRAN
的目的是能够在它们之间使用@@ERROR
函数和/或ROLLBACK TRAN
吗?
IF OBJECT_ID('tempdb..#testTable') IS NOT NULL DROP TABLE #testTable
create table #testTable
(
Id int not null,
Name varchar(100)
)
BEGIN TRAN T1;
insert into #testTable select null, 'Joe';
-- select @@ERROR
if @@ERROR = 0
BEGIN
insert into #testTable select 1, 'Bob';
insert into #testTable select 2, 'Ralph';
END
COMMIT TRAN T1;
select * From #testTable
感谢。
答案 0 :(得分:3)
表变量(@testTable
)执行 NOT 支持事务。
如果您需要事务支持,请改用普通的临时表(#testTable
)。
答案 1 :(得分:2)
要使这个系列插入一个"全部或全部"您需要使用TRY / CATCH的情况
IF OBJECT_ID('tempdb..#testTable') IS NOT NULL DROP TABLE #testTable
create table #testTable
(
Id int not null,
Name varchar(100)
)
begin try
BEGIN TRAN T1;
insert into #testTable select 1, 'Bob';
insert into #testTable select null, 'Joe';
insert into #testTable select 2, 'Ralph';
COMMIT TRAN T1;
end try
begin catch
select 'Error encountered. No rows added'
rollback transaction
end catch
select * From #testTable