zoukankan      html  css  js  c++  java
  • 使用WHILE代替游标的遍历操作

             游标操作会锁住被遍历的表,容易引起死锁,应当尽量避免使用。

    原游标代码:
        DECLARE @tbTargetPermissions    table(TargetPermissionId uniqueidentifier NOT NULL PRIMARY KEY)
        
    INSERT INTO @tbTargetPermissions 
            
    SELECT [TargetPermissionId] 
            
    FROM [ps_RolePermissions] 
            
    WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId
        
        
    DECLARE @TargetPermissionId uniqueidentifier;

        
    --定义游标
        DECLARE TargetPermissions_ByRoleId_Cursor CURSOR FOR 
            
    SELECT [TargetPermissionId] FROM @tbTargetPermissions 

        
    --打开游标
        OPEN TargetPermissions_ByRoleId_Cursor

        
    --读取游标第一条记录
        FETCH NEXT FROM    TargetPermissions_ByRoleId_Cursor INTO @TargetPermissionId

        
    --检查@@FETCH_STATUS的值,以便进行循环读取
        WHILE @@FETCH_STATUS = 0
        
    BEGIN
            
    EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;

            
    FETCH NEXT FROM    TargetPermissions_ByRoleId_Cursor INTO @TargetPermissionId;
        
    END

        
    --关闭游标
        CLOSE TargetPermissions_ByRoleId_Cursor
        
    DEALLOCATE TargetPermissions_ByRoleId_Cursor

    改用While后仍然可以遍历执行存储过程 ps_TargetPermissionEntity_Select
        --把合符条件的目标权限Id加载到一个临时表变量中
        DECLARE @tbTargetPermissions    table(IndexId int IDENTITY (01NOT NULL PRIMARY KEY, TargetPermissionId uniqueidentifier NOT NULL)
        
    INSERT INTO @tbTargetPermissions 
            
    SELECT [TargetPermissionId] 
            
    FROM [ps_RolePermissions] 
            
    WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId

        
    DECLARE @MaxIndexId int;
        
    SELECT  @MaxIndexId = MAX([IndexId]FROM @tbTargetPermissions--计算最大记录序号,用于遍历列表

        
    WHILE @MaxIndexId > -1
        
    BEGIN
            
    DECLARE @TargetPermissionId uniqueidentifier;
            
    SELECT @TargetPermissionId = [TargetPermissionId] FROM @tbTargetPermissions WHERE [IndexId] = @MaxIndexId;

            
    EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;

            
    --删除最大记录项,重新判断记录项是否大于-1,以此判断是否遍历完列表
            DELETE @tbTargetPermissions WHERE [IndexId] = @MaxIndexId;
            
    SELECT  @MaxIndexId = MAX([IndexId]FROM @tbTargetPermissions 
            
    --SELECT @MaxIndexId--测试(倒序)
        END

    执行效果相同,就是这里的while与上一方法的排序是相反的,如果对排序顺序有要求的,可以改变一下算法。
    按顺序排列的代码如下:
        --把合符条件的目标权限Id加载到一个临时表变量中
        DECLARE @tbTargetPermissions    table(IndexId int IDENTITY (01NOT NULL PRIMARY KEY, TargetPermissionId uniqueidentifier NOT NULL)
        
    INSERT INTO @tbTargetPermissions 
            
    SELECT [TargetPermissionId] 
            
    FROM [ps_RolePermissions] 
            
    WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId

        
    DECLARE @MinIndexId int;
        
    DECLARE @MaxIndexId int;
        
    SELECT  @MinIndexId = MIN([IndexId]FROM @tbTargetPermissions--计算最小记录序号,用于遍历列表
        SELECT  @MaxIndexId = MAX([IndexId]FROM @tbTargetPermissions--计算最大记录序号,用于遍历列表

        
    WHILE @MinIndexId <= @MaxIndexId
        
    BEGIN
            
    --SELECT @MinIndexId,@MaxIndexId--测试(顺序)
            DECLARE @TargetPermissionId uniqueidentifier;
            
    SELECT @TargetPermissionId = [TargetPermissionId] FROM @tbTargetPermissions WHERE [IndexId] = @MinIndexId;

            
    EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;

            
    --删除最小记录项,重新判断最小记录项是否小于等于最大记录项,以此判断是否遍历完列表
            DELETE @tbTargetPermissions WHERE [IndexId] = @MinIndexId;
            
    SELECT  @MinIndexId = MIN([IndexId]FROM @tbTargetPermissions
        
    END
  • 相关阅读:
    课程作业08:课后作业之字串加密、动手动脑之String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明、阅读笔记发表到博客园。
    课程作业07:请编写一个程序,使用上述算法加密或解密用户输入的英文字符串。
    课程作业06:验证课件上的代码,并将所有的动手动脑或要求发表博客作业部分整理成一篇博客发表。
    课程作业05:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”
    Django 学习之用户认证组件auth与User对象
    Django 学习之中间件Middleware
    Django学习 之后端视图与ajax
    Django 学习之cookie与session
    Django 学习 之ORM聚合查询分组查询与F查询与Q查询
    Django 学习 之ORM多表操作
  • 原文地址:https://www.cnblogs.com/chenjunbiao/p/1760240.html
Copyright © 2011-2022 走看看