create PROCEDURE [dbo].[p_Permission] -- ======================================== -- 权限 -- ======================================== -- 参数: -- 返回值: -- 注:5次失败尝试。(锁定失败、死锁) -- ======================================== ( @strActionType varChar(1000) -- 操作类型: 取值: Insert 、Update 、Delete ,@intPermissionIds varChar(1000) -- 主键(组) ,@intOrganizationId varChar(1000) -- 组织 ,@strPermissionNumber varChar(1000) -- 编号 ,@strPermissionName varChar(1000) -- 名称 ,@strNote varChar(1000) -- 备注 ) AS -- 定义变量 ------------------------------------------------- DECLARE @Err INT , -- 错误编号 @ErrCounter INT , -- 错误次数 @ErrCounterMax INT , -- 最大错误次数 @code varChar(1000) , -- 返回代码 @message varChar(1000) , -- 返回信息 BEGIN SET @ErrCounter = 0 SET @ErrCounterMax = 5 LockTimeOutRetry: -- 锁定超时入口 BEGIN TRY -- (1)Insert ------------------------------------------------- IF @strActionType = 'Insert' INSERT INTO t_Permission( f_intOrganizationId ,f_strPermissionNumber ,f_strPermissionName ,f_strNote ) VALUES( @intOrganizationId ,@strPermissionNumber ,@strPermissionName ,@strNote ) -- (2)Update ------------------------------------------------- IF @strActionType = 'Update' update t_Permission set f_intOrganizationId = @intOrganizationId , f_strPermissionNumber = @strPermissionNumber , f_strPermissionName = @strPermissionName , f_dtmLastModified = getDate() , f_strNote = @strNote where f_intPermissionId = @intPermissionIds -- (3)Delete ------------------------------------------------- IF @strActionType = 'Delete' begin DECLARE @delSQL VARCHAR(MAX) set @delSQL = ' Delete t_Permission where [f_intPermissionId] in ( ' + @intPermissionIds + ' )' exec( @delSQL ) end END TRY -- 错误检测 ------------------------------------------------- BEGIN CATCH set @Err = @@ERROR IF @Err <> 0 GOTO ErrorHandler 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