一首先从SQLServer中Error讲起SQL中错误处理有些怪辟 错误级别同是但结果都不同
以下是引用片段
select * from 一个不在的表
if @@error<>
print 这个没有输出
go
raiserror()
if @@error<>
print 这个输出了
go
exec(select * from 一个不在的表)
if @@error<>
print 这个输出了
go
exec sp_executesql Nselect * from 一个不在的表
if @@error<>
print 这个输出了
这样你可以发现通过exec或sp_executesql执行可疑的sql这样就可以在后面捕捉到被异常终止的错误
二引出孤立事务
孤立事务的产生
以下是引用片段
select @@trancount 当前连接的活动事务数 当前连接的活动事务数为
begin tran
select * from 一个不在的表
if @@error<>
begin
print 没有执行到这里来!
if @@trancount<> rollback tran
end
commit tran
select @@trancount 当前连接的活动事务数 执行后你看看 当前连接的活动事务数为且重复执行会每次累加这是很耗资源的
应为rollback根本就没有被回滚
使用现有手段解决孤立事务
以下是引用片段
print @@trancount print 当前连接的活动事务数 当前连接的活动事务数为
if @@trancount<> rollback tran 在这里写可以让孤立事务只保持到下次你的过程被调用
begin tran
select * from 一个不在的表
if @@error<>
begin
print 没有执行到这里来!
if @@trancount<> rollback tran
end
commit tran
执行后你看看 当前连接的活动事务数为但重复执行不会累加
print @@trancount print 当前连接的活动事务数
[] []