CREATE PROC RaiseErrorTest
AS
BEGIN
RAISERROR 13001 'this is 13001 error';
END
GO
DECLARE @errNum INT;
SET @errNum = 0;
EXEC RaiseErrorTest;
SET @errNum = @@ERROR;
--如果没有错误,就commit交易
IF @errNum = 0
BEGIN
PRINT '执行OK Commit'
END
ELSE
BEGIN
PRINT '执行失败 Rollback'
END
GO
--执行结果会显示「执行失败 Rollback ,如下,
--Msg 13001, Level 16, State 1, Procedure RaiseErrorTest, Line 4
--this is 13001 error
--执行失败 Rollback
--但是在SQL 2012中一执行到该Store Procedure,就发生以下的错误,
--Msg 102, Level 15, State 1, Procedure RaiseErrorTest, Line 4
--接近 '13001' 之处的语法不正确。
--原因是因为我们使用了以下的RAISERROR语法过期了(从Sybase来的,可参考:raiserror)
--而在SQL 2008R2就说未来版本不Support以上的写法(SQL 2012还真的给我不Support)! 请参考:Deprecated Database Engine Features in SQL Server 2008 R2
--不过,那为何那支Store Procedure,可以被建立到SQL 2012的DB之中呢?
--因为那个DB是后SQL 2005备份好之后,再Restore到SQL 2012上,所以如果要重新将该Store Procedure执行到该DB的话,就会发生同样的问题。
--知道了问题所在就要加以调整它,如下,
CREATE PROC RaiseErrorTest2
AS
BEGIN
RAISERROR('this is 13001 error', 10, 1);
END
GO
--再执行以下的SQL,
DECLARE @errNum INT;
SET @errNum = 0;
EXEC RaiseErrorTest2;
SET @errNum = @@ERROR;
IF @errNum = 0
BEGIN
PRINT '执行OK Commit'
END
ELSE
BEGIN
PRINT '执行失败 Rollback'
END
--但执行结果却显示「执行OK Commit」,天呀! 我的@@ERROR的值变成0了!如下,
--this is 13001 error
--执行OK Commit
CREATE PROC RaiseErrorTest3
AS
BEGIN
RAISERROR(50001, 10, 1);
END
GO
--再執行以下的SQL,
DECLARE @errNum INT;
SET @errNum = 0;
EXEC RaiseErrorTest3;
SET @errNum = @@ERROR;
IF @errNum = 0
BEGIN
PRINT '執行OK Commit'
END
ELSE
BEGIN
PRINT '執行失敗 Rollback'
END
--执行结果会显示「执行失败 Rollback」(只是@@ERROR的值变成了18054,而不是我们要的50001,但针对我们旧有「只判断@@ERROR不为0」的做法算是可以兼容过去),如下,
--Msg 18054, Level 16, State 1, Procedure RaiseErrorTest3, Line 4
--Error 50001, severity 10, state 1 was raised, but no message with that error number was found in sys.messages. If error is larger than 50000, make sure the user-defined message is added using sp_addmessage.
--执行失败 Rollback