WEB开发网
开发学院数据库MSSQL Server 基于SQL Server 的Exception Handling - PART II 阅读

基于SQL Server 的Exception Handling - PART II

 2008-12-06 10:15:28 来源:WEB开发网   
核心提示: 虽然说在上面的Stored procedure中,我们在困难出现Exception的地方添加了RETURN,基于SQL Server 的Exception Handling - PART II(2),从而防止了后续的程序继续执行,但是对于一些我们无法预知的Exception呢?我们该如何添

虽然说在上面的Stored procedure中,我们在困难出现Exception的地方添加了RETURN,从而防止了后续的程序继续执行,但是对于一些我们无法预知的Exception呢?我们该如何添加这个RETURN呢?我想有人会说在每条语句执行之后都通过@@ERROR判断是否有Exception出现,我知道很多人喜欢这么做,而事实上,我现在真在维护的一些Stored procedure就是这么做的:全篇都是IF@@ERROR RETURN。其实我们完全可以通过其它的方式是我们的SQL看出来更加优雅一点。那就是使用我们很熟悉的TRY CATCH。在SQL Server中我们通过BEGIN TRY/END TRY和BEGIN CATCH/END CATCH这样的结构来进行Exception Handling。

通过TRY CATCH,上面的Stored procedure可以改成下面的样子:

CREATE Procedure P_USERS_IN_ROLES_I
  (
    @user_name  NVARCHAR(256),
    @role_name  NVARCHAR(256)
  )
AS
DECLARE @user_id  VARCHAR(50)
DECLARE @role_id  VARCHAR(50)
  
DECLARE @error_message  NVARCHAR(256)
DECLARE @error_serverity  INT
DECLARE @error_state    INT
  
BEGIN TRY
  
SELECT @user_id = [USER_ID] FROM dbo.T_USERS WHERE LOWERED_USER_NAME = LOWER(@user_name)
IF(@user_id IS NULL)
  BEGIN
    RAISERROR ('The user dose not exist',16,1)
  END
  
SELECT @role_id = [ROLE_ID] FROM dbo.T_ROLES WHERE LOWERED_ROLE_NAME = LOWER(@role_name)
IF(@role_id IS NULL)
  BEGIN
    RAISERROR ('The role dose not exist',16,1)
  END
IF(EXISTS(SELECT * FROM T_USERS_IN_ROLES WHERE [USER_ID] = @user_id AND ROLE_ID = @role_id))
  BEGIN
    RAISERROR ('The user is already in the role',16,1)
  END  
INSERT INTO   dbo.T_USERS_IN_ROLES([USER_ID],ROLE_ID) VALUES(@user_id,@role_id)
  
END TRY
  
BEGIN CATCH  
  
  SET @error_message  = ERROR_MESSAGE)
  SET @error_serverity  = ERROR_SEVERITY()
  SET @error_state    = ERROR_STATE()
  RAISERROR(@error_message,@error_serverity,@error_state)    
  
END CATCh

上一页  1 2 3 4 5 6 7  下一页

Tags:基于 SQL Server

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接