create PROCEDURE [dbo].[p_bomGroup] -- ======================================== -- 权限 -- ======================================== -- 参数: -- 返回值: -- 注:5次失败尝试。(锁定失败、死锁) -- ======================================== ( @strActionType varChar(1000) -- 操作类型: 取值: Insert 、Update 、Delete ,@intBomGroupIds varChar(1000) -- 主键(组) ,@intParentId varChar(1000) -- 父类 ,@strName varChar(1000) -- 名称 ,@strNumber varChar(1000) -- 编号 ,@strBootId varChar(1000) -- ) AS -- 定义变量 ------------------------------------------------- DECLARE @Err INT , -- 错误编号 @ErrCounter INT , -- 错误次数 @ErrCounterMax INT , -- 最大错误次数 @code varChar(1000) , -- 返回代码 @message varChar(1000) -- 返回信息 BEGIN BEGIN TRANSACTION BOMGROUPTRAN SET @ErrCounter = 0 SET @ErrCounterMax = 5 LockTimeOutRetry: -- 锁定超时入口 BEGIN TRY -- (1)Insert ------------------------------------------------- IF UPPER(@strActionType) = UPPER('Insert') INSERT INTO db_20101014_Wangy.dbo.ICBOMGroup( FInterID ,FParentID ,FName ,FNumber ,FBootID ) VALUES( @intBomGroupIds ,@intParentId ,@strName ,@strNumber ,@strBootId ) -- (2)Update ------------------------------------------------- IF UPPER(@strActionType) = UPPER('Update') /*update t_Permission set f_intOrganizationId = @intOrganizationId , f_strPermissionNumber = @strPermissionNumber , f_strPermissionName = @strPermissionName , f_dtmLastModified = getDate() , f_strNote = @strNote where f_intPermissionId = @intPermissionIds */ UPDATE db_20101014_Wangy.dbo.ICBOMGroup SET FParentID=@intParentId ,FName=@strName ,FNumber=@strNumber ,FBootID=@strBootId WHERE FInterID=FInterID -- (3)Delete ------------------------------------------------- IF @strActionType = 'Delete' begin DECLARE @delSQL VARCHAR(MAX) set @delSQL = ' Delete db_20101014_Wangy.dbo.ICBOMGroup where [FInterID] in ( ' + @intBomGroupIds + ' )' exec( @delSQL ) end END TRY -- 错误检测 ------------------------------------------------- BEGIN CATCH set @Err = @@ERROR IF @Err <> 0 BEGIN ROLLBACK TRANSACTION BOMGROUPTRAN GOTO ErrorHandler END COMMIT TRANSACTION BOMGROUPTRAN END CATCH -- Success select 0 as code, 'Success!' as message RETURN -- 错误处理 ------------------------------------------------- ErrorHandler: IF (@err = 1222 OR @err = 1205) AND @ErrCounter >= @ErrCounterMax Begin RAISERROR('Unable to Lock Data after a few attempts.',16,1) set @code = @err SELECT @message =ERROR_MESSAGE() END IF @err = 1222 OR @err = 1205 -- Lock Timeout / Deadlock BEGIN WAITFOR DELAY '00:00:00.25' SET @ErrCounter = @ErrCounter + 1 GOTO LockTimeOutRetry END -- else unknown error set @code = @err SELECT @message = ERROR_MESSAGE() -- RAISERROR( @message ,16,1) select @code as code, @message as message END RETURN -- end