?? sql中的錯誤處理_1.sql
字號:
--下面演示了SQL錯誤處理的脆弱性
--鄒建
--演示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 p1
if @@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
go
select * from #t
rollback tran
/*--測試結果
(所影響的行數為 1 行)
服務器: 消息 208,級別 16,狀態 1,行 5
對象名 'newid' 無效。
id
-----------
1
(所影響的行數為 1 行)
--*/
/*--結論3:
我們希望 set xact_abort on 可以實現出錯時自動回滾事務
但結果令我們希望,出錯時,事務并沒有被回滾
因為我們查詢到了#t的結果,而且最后的回滾語句也并沒有報錯
--*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -