如果存储过程执行中遇到了错误(严重错误),就会终止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'
(
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' 无效。
--*/
--测试的存储过程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 异常结束
--*/
--演示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 异常结束
--*/