zoukankan      html  css  js  c++  java
  • MS SQL Server 2008 游标嵌套与事务应用

    declare @AssStuId varchar(20) = '51000096',

            @ScoreSource varchar(20) = '一体化考核',

        @CreateId varchar(20) = '123456789'

    declare ExpTempCursor cursor for

        select

            i.StuID

            ,cls.BeginDate,cls.EndDate

            ,isnull(((s.LLScore * 0.3) + (s.SCScore * 0.7)),0) as TotalScore

            ,pro.Name as ProfessionName

            ,m.ModuleName

            ,post.Layer,cls.ItemID,post.ClassRoomTypeID

        from PT_ClassStu s inner join PT_StuInfo i on i.StuID=s.StuID

            inner join PT_Class as cls on s.ClassID = cls.ClassID

            inner join PT_Module as m on cls.ModuleID = m.ModuleID

            inner join PT_Post as post on m.PostID = post.PostID

            inner join PT_Profession as pro on post.ProfessionID = pro.ProfessionID

        where s.StuID = @AssStuId

        and isnull(((s.LLScore * 0.3) + (s.SCScore * 0.7)),0) > 60

        open ExpTempCursor

        declare @StuID varchar(20),@BeginDate date,@EndDate date

        declare @TotalScore float,@ProfessionName varchar(50)

        declare @ModuleName varchar(100),@Layer int,@ItemId varchar(20)

        declare @TranError int = 0,@expCount int,@ExperienceName varchar(200),@ClassRoomId int

        

        fetch next from ExpTempCursor

        into @StuID,@BeginDate,@EndDate,@TotalScore,@ProfessionName,@ModuleName,@Layer,@ItemId,@ClassRoomId

        

        while(@@FETCH_STATUS = 0)

        begin

            set @ExperienceName = @ProfessionName + '(' + @ModuleName + ')'

            select @expCount = Count(ExperienceInfoId)

            from CER_ExperienceInfo

            where StuInfoId = @StuID

                and ExperienceName = @ExperienceName

                and LevelNo = @Layer + ''

                and BeginDate = @BeginDate

                and EndDate = @EndDate

                

            if(@expCount = 0)

            begin

                begin tran Tran_ImportFunc

                begin try

                

                --插入实训信息

                insert into CER_ExperienceInfo(StuInfoId,ExperienceName,LevelNo,BeginDate,EndDate

                    ,TotalSocre,GradeSource,StateStatistical,CreateDate,CreateId,Remark)

                    values(@StuID,@ExperienceName,@Layer + '',@BeginDate,@EndDate,@TotalScore,@ScoreSource

                    ,1,CURRENT_TIMESTAMP,@CreateId,'')

                

                declare @expId int

                select    @expId=SCOPE_IDENTITY()

                

                --插入任务信息

                declare taskCursor cursor for

                

                select TaskName,m.ModuleId,tv.SXPeriod

                from PT_Module m

                left outer join PT_Item i on m.ModuleID=i.ModuleID

                left outer join PT_TaskItem ti on i.itemId=ti.ItemId

                left outer join PT_Task t on t.TaskID=ti.TaskID

                left outer join PT_TaskVersion tv on t.TaskID=tv.TaskID and tv.IsCurrent=1

                where i.ItemId = @ItemId

                

                open taskCursor

                

                declare @TaskName varchar(50),@ModuleId varchar(20),@ClassHour float

                while(@@FETCH_STATUS = 0)

                begin

                    fetch next from taskCursor into @TaskName,@ModuleId,@ClassHour

                    

                    insert into CER_Task(ExperienceInfoId,TaskName,ClassHour,ModuleID,Remark)

                    values(@expId,@TaskName,@ClassHour,@ModuleId,'')

                end

                

                close taskCursor

                deallocate taskCursor

                

                declare @CerNo varchar(15)

                declare @RoomName varchar(400),@RoomCode varchar(2)

                select @RoomName = Name from SYS_Column where CId = @ClassRoomId

                

                select @RoomCode = case @RoomName

                                    when '智能楼宇实训中心' then '01'

                                    when '工业自动化控制实训中心' then '02'

                                    when '现代汽车维修实训中心' then '03'

                                    when '现代汽车维修实训中心' then '04'

                                    when '数控加工实训中心' then '05'

                                    when '数字印刷实训中心' then '06'

                                    when '会展技术实训中心' then '07'

                                    else '01' end

                

                declare @LayerCode varchar(1)

                

                select @LayerCode = case @Layer

                                    when 0 then '4'

                                    when 1 then '3'

                                    when 2 then '2'

                                    when 3 then '1'

                                    else '1' end

                

                declare @Counts int,@CerNumber varchar(4) = '0000'

                

                select @Counts = Count(LicenceDate)

                from CER_Certificate

                where DATEPART(YEAR, LicenceDate) = DATEPART(YEAR, CURRENT_TIMESTAMP)

                

                set @Counts = @Counts + 1

                set @CerNumber = case LEN(@Counts)

                                when 1 then '000'+cast(@Counts as varchar)

                                when 2 then '00'+cast(@Counts as varchar)

                                when 3 then '0'+cast(@Counts as varchar)

                                when 4 then cast(@Counts as varchar)

                                else '0000' end

                

                

                set @CerNo = 'GXJY' + cast(DATEPART(YEAR, GETDATE()) as varchar(4)) + @RoomCode + @LayerCode + @CerNumber

                

                

                --插入证书编号

                insert into CER_Certificate(StuId,ExperienceInfoId,LicenceDate,CerCode,CreateId,CreateDate,Remark)

                values(@StuID,@expId,CURRENT_TIMESTAMP,@CerNo,@CreateId,CURRENT_TIMESTAMP,'')

                

                end try

        BEGIN CATCH

            PRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()

            SET @TranError = @TranError + 1

        END CATCH

                IF(@TranError > 0)

                BEGIN

                    --执行出错,回滚事务

                    ROLLBACK TRAN;

                    PRINT '导入失败!';

                END

                ELSE

                BEGIN

                    --没有异常,提交事务

                    COMMIT TRAN;

                    PRINT '导入成功!';

                END

            end

            fetch next from ExpTempCursor

            into @StuID,@BeginDate,@EndDate,@TotalScore,@ProfessionName,@ModuleName,@Layer,@ItemId,@ClassRoomId

        end

        close ExpTempCursor

        deallocate ExpTempCursor

  • 相关阅读:
    PHP实现4种排序算法
    PHP反射获取当前函数的内容
    PHP递归目录的5种方法
    生成随机数组
    empty、isset、is_null的比较
    PHP哈希表碰撞攻击
    XMLHttpRequest的跨域请求
    CI框架SESSION重写
    PHP开发第一个扩展
    PHP面试题集之基础题
  • 原文地址:https://www.cnblogs.com/BlueEye/p/4885585.html
Copyright © 2011-2022 走看看