如果存储过程执行中遇到了错误(严重错误),就会终止sp的执行,但是如果想让sp跳过错误,继续执行后面的语句,怎么办?
1,在sql server 2005中可以用try...catch解决。
- CREATE TABLE testTable
- (
- id int IDENTITY(1,1),
- name nvarchar(20) NOT NULL,
- pass nvarchar(20)
- )
- CREATE PROCEDURE testTableInsert
- @name nvarchar(20),
- @pass nvarchar(20)
- AS
- BEGIN TRY
- INSERT INTO testTable
- VALUES(@name,@pass)
- END TRY
- BEGIN CATCH
- PRINT @@error
- PRINT 'error'
- END CATCH
- SELECT * FROM Test--(怎是存在的表)
- EXEC testTableInsert null,'test'
2,sql server 2005之前,用sp嵌套的方法(来自zjcxc(邹建))
- --下面演示了SQL错误处理的脆弱性
- --测试的存储过程1
- create proc p1
- as
- print 12/0
- if @@error<>0
- print 'error 1'
- select * FROM SwcPage
- if @@error<>0
- print 'error 2'
- go
- --调用
- exec p1
- go
- --删除测试
- drop proc p1
- /*--测试结果
- 服务器: 消息 8134,级别 16,状态 1,过程 p1,行 6
- 遇到被零除错误。
- 发生错误1
- 服务器: 消息 208,级别 16,状态 1,过程 p1,行 10
- 对象名 'newid' 无效。
- --*/
- --下面演示了SQL错误处理的脆弱性
- --演示2,存储过程嵌套调用中的错误
- --测试的存储过程1
- create proc p1
- as
- print 12/0
- if @@error<>0
- print 'error 1'
- select * from newid()
- if @@error<>0
- print 'error 2'
- go
- --测试的存储过程2
- create proc p2
- as
- exec p1
- if @@error<>0
- print 'call sp1 error end'
- else
- print 'call sp1 normal end'
- go
- --调用
- exec p2
- go
- --删除测试
- drop proc p1,p2
- /*--测试结果
- 服务器: 消息 8134,级别 16,状态 1,过程 p1,行 8
- 遇到被零除错误。
- 发生错误1
- 服务器: 消息 208,级别 16,状态 1,过程 p1,行 12
- 对象名 'newid' 无效。
- 调用 存储过程1 异常结束
- --*/