您的位置:首页 > 数据库

SQL中存储过程中使用事务,并且加入异常处理机制.

2014-05-06 11:21 645 查看
--存储过程中使用事务,并且加入异常处理机制.
-- =============================================
CREATE PROCEDURE [dbo].[UP_Orders_Import]
AS
BEGIN
BEGIN TRAN  --开启事务
BEGIN TRY

SELECT 1/0

COMMIT TRAN  --提交事务
END TRY
BEGIN CATCH
DECLARE
@ErrorMessage NVARCHAR(4000) ,
@ErrorNumber INT ,
@ErrorSeverity INT ,
@ErrorState INT ,
@ErrorLine INT ,
@ErrorProcedure NVARCHAR(200) ;

SELECT
@ErrorNumber=ERROR_NUMBER(),@ErrorSeverity=ERROR_SEVERITY(),
@ErrorState=ERROR_STATE(),@ErrorLine=ERROR_LINE(),
@ErrorProcedure=ISNULL(ERROR_PROCEDURE(),'-') ;
SELECT
@ErrorMessage=N'Error %d, Level %d, State %d, Procedure %s, Line %d, '
+'Message: '+ERROR_MESSAGE() ;
RAISERROR
(
@ErrorMessage,
@ErrorSeverity,
1,
@ErrorNumber,    -- parameter: original error number.
@ErrorSeverity,  -- parameter: original error severity.
@ErrorState,  -- parameter: original error state.
@ErrorProcedure, -- parameter: original error procedure name.
@ErrorLine       -- parameter: original error line number.
) ;
ROLLBACK TRAN  --回滚事务
END CATCH
END


  sql事务注意点:

DECLARE @Referenznummer NVARCHAR(MAX)
SET @Referenznummer = '934590-AE1023-1'

BEGIN TRAN
BEGIN TRY

DECLARE @returnValue INT
SET @returnValue = 11110

--(1)、变量在事务中是不会进行回滚的;默认值虽然是11110
SET @returnValue = 1

IF (
NOT EXISTS ( SELECT 1
FROM   tbOrder
WHERE  Referenznummer = @Referenznummer )
)
BEGIN

--(2)、出现异常后,直接终止下面的代码,跳转到CATCH代码块中.
SELECT  10 / 0
--begin
SELECT  @@ERROR
SELECT  100
IF (@@error <> 0)   --此语句在try catch中是捕获不到的。
BEGIN
SET @returnValue = 0
END
--end
END
ELSE
BEGIN
SET @returnValue = 3
END
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT 'error'
--SET @returnValue = 0
ROLLBACK TRAN
END CATCH

SELECT  @returnValue
--RETURN @returnValue


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: