Create proc sp_A as insert into tbl_A(A,B) values(1,'A') --values关键字写错 if @@error <>0
select 'insert into tbl_A failed' else
select 'insert into tbl_A success'
select 'insert into tbl_A failed' else
select 'insert into tbl_A success'
有begin tran的
有begin try的在存储过程中,只有出错,这些也根本没有,begin try 根本编译不过,begin tran编译过,也没用,出错直接跳出,不会给你
rollback的执行空间。
insert ta .....
if @@error<>0
begin
rollback tran
end.......
commit tran
一旦出错,就跳出sp,而得不到检测@@error的机会
begin try
insert into tbl_A(A,B) values(1,'A') --values关键字写错
end try
begin catch
if @@error <>0
select 'insert into tbl_A failed' else
select 'insert into tbl_A success'
end catch
在试试
insert into tbl_A(A,B) valeues(1,'A') --values关键字写错
end try
begin catch
if @@error <>0
select 'insert into tbl_A failed' else
select 'insert into tbl_A success'
end catch 消息 102,级别 15,状态 1,第 2 行
'valeues' 附近有语法错误。我用2005试结果这样。
有这个,当然可以抓到异常了。2000版,难道,使用@@error就不灵了吗?
你可以看看如果把他写在一个显式事务里,如果该事务失败,后面的语句是否会执行,好像在批模式下,前一个语句出错后面的语句还会执行,不太确定,我现在没办法试
这个错误,好像都不能通过语法检查吧,那应该是创建存储过程就失败了,何来执行、捕捉错误?
as
begin
set nocount on;
insert into tbl_A(A,B) values(1,'A') if @@error <>0
select 'insert into tbl_A failed'
else
select 'insert into tbl_A success'
end
/*
A设为主键,两次插入相同数据:
第一次结果
-------------------------
insert into tbl_A successReturn Value
------------
0
第二次结果
消息 2627,级别 14,状态 1,过程 sp_A,第 6 行
违反了 PRIMARY KEY 约束 'PK_tbl_A'。不能在对象 'dbo.tbl_A' 中插入重复键。
语句已终止。
------------------------
insert into tbl_A failedReturn Value
------------
-4
*/
'BULK INSERT tbl_A FROM ''c:\temp\temp.dat'' WITH ( DATAFILETYPE = ''char'', FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'',TABLOCK)'
)如果文件不存在,则直接退出sp,其他什么情况下,不会直接提出,继续执行,如果不直接退出的话,错误在应用程序能抓到吗?如果抓到的话,sp还会继续执行下去吗?
begin transome expression...
commit tran
end try
begin catch
rollback
end catch如果some expression 抛出异常,流程直接转到 catch块,问题是,难道一定要我们自己去rollback,而系统不会自动rollback吗?