sql错误处理及如何调试?欢迎参与,进者有分!..... IF @ErrorVar <> 0print '错误' 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 上面错了IF @@Error <> 0print '错误' --下面演示了SQL错误处理的脆弱性--邹建--演示1--测试的存储过程1create proc p1asprint 12/0if @@error<>0 print '发生错误1'select * from newid()if @@error<>0 print '发生错误2'go--调用exec p1go--删除测试drop proc p1/*--测试结果服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6遇到被零除错误。发生错误1服务器: 消息 208,级别 16,状态 1,过程 p1,行 10对象名 'newid' 无效。--*//*--结论1:错误1,不是严重的错误,所以SQL会执行下去错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果--*/--演示2,存储过程嵌套调用中的错误--测试的存储过程1create proc p1asprint 12/0if @@error<>0 print '发生错误1'select * from newid()if @@error<>0 print '发生错误2'go--测试的存储过程2create proc p2asexec p1if @@error<>0 print '调用 存储过程1 异常结束'else print '调用 存储过程1 正常结束'go--调用exec p2go--删除测试drop proc p1,p2/*--测试结果服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8遇到被零除错误。发生错误1服务器: 消息 208,级别 16,状态 1,过程 p1,行 12对象名 'newid' 无效。调用 存储过程1 异常结束--*//*--结论2:被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去--*/--演示3,更严重的错误,无法用 set xact_abort on 来自动回滚事务set xact_abort on --我们希望能自动回滚事务begin tran create table #t(id int) insert #t select 1 select * from newid()commit trangoselect * from #trollback tran/*--测试结果(所影响的行数为 1 行)服务器: 消息 208,级别 16,状态 1,行 5对象名 'newid' 无效。id ----------- 1(所影响的行数为 1 行)--*//*--结论3:我们希望 set xact_abort on 可以实现出错时自动回滚事务但结果令我们希望,出错时,事务并没有被回滚因为我们查询到了#t的结果,而且最后的回滚语句也并没有报错--*/ 上述是 2000 中的测试在 sql 2005 中, 错误处理已经增强了很多, 可以用 TRY CATCH, 能够处理绝大部分错误(但会导致连接断开这类的错误是无法在 sql 中处理的) RAISERROR ('A custom error has been thrown.', 16, 1) 对于上面这个模拟的错误, 如果没有设置 SET XACT_ABORT ON, 或者没有用在 TRY ... CATCH 中, 则后面的语句都会执行, 无论是用在触发器/事务中,结果都是这样 连接两张表,怎么样写sql语句效率最高? 查询重复数据 用2个客户端访问同一个服务器,一台可以一台不行,提示“SQL server 不存在或访问被拒绝” sql访问excel表 数据库呈质疑状态,怎么恢复?急 在新建 SQL Server 数据库时,初始化数据库字节数大一些(如500M)与小一些(如1M)有什么区别,各有什么好处?大伙一般都设成多大? 紧急求助大家谢谢 请问如何在SQL Server的查询中,返回记录的当前序号? oracle语句中如何实现SqlServer中updlock的功能 SQL语句中的minus和union的问题 數據合並問題 触发器在插入数据时 不能执行
IF @@Error <> 0
print '错误'
--邹建--演示1
--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'select * from newid()
if @@error<>0
print '发生错误2'
go--调用
exec p1
go--删除测试
drop proc p1/*--测试结果服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
对象名 'newid' 无效。--*/
/*--结论1:错误1,不是严重的错误,所以SQL会执行下去
错误2,属于严重的错误,所以SQL没有执行下去,因为没有第二个print的结果--*/--演示2,存储过程嵌套调用中的错误--测试的存储过程1
create proc p1
as
print 12/0
if @@error<>0
print '发生错误1'select * from newid()
if @@error<>0
print '发生错误2'
go--测试的存储过程2
create proc p2
as
exec p1if @@error<>0
print '调用 存储过程1 异常结束'
else
print '调用 存储过程1 正常结束'
go--调用
exec p2
go--删除测试
drop proc p1,p2/*--测试结果服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
遇到被零除错误。
发生错误1
服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
对象名 'newid' 无效。
调用 存储过程1 异常结束
--*/
/*--结论2:被调用的存储过程发生严重错误时,调用它的存储过程可以捕获错误,并可以继续执行下去
--*/--演示3,更严重的错误,无法用 set xact_abort on 来自动回滚事务
set xact_abort on --我们希望能自动回滚事务
begin tran
create table #t(id int)
insert #t select 1
select * from newid()
commit tran
goselect * from #t
rollback tran
/*--测试结果
(所影响的行数为 1 行)服务器: 消息 208,级别 16,状态 1,行 5
对象名 'newid' 无效。id
-----------
1(所影响的行数为 1 行)
--*//*--结论3:我们希望 set xact_abort on 可以实现出错时自动回滚事务
但结果令我们希望,出错时,事务并没有被回滚
因为我们查询到了#t的结果,而且最后的回滚语句也并没有报错
--*/
在 sql 2005 中, 错误处理已经增强了很多, 可以用 TRY CATCH, 能够处理绝大部分错误(但会导致连接断开这类的错误是无法在 sql 中处理的)