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

原游标代码:
使用WHILE代替游标的遍历操作    DECLARE @tbTargetPermissions    table(TargetPermissionId uniqueidentifier NOT NULL PRIMARY KEY)
使用WHILE代替游标的遍历操作    
INSERT INTO @tbTargetPermissions 
使用WHILE代替游标的遍历操作        
SELECT [TargetPermissionId] 
使用WHILE代替游标的遍历操作        
FROM [ps_RolePermissions] 
使用WHILE代替游标的遍历操作        
WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId
使用WHILE代替游标的遍历操作    
使用WHILE代替游标的遍历操作    
DECLARE @TargetPermissionId uniqueidentifier;
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
--定义游标
使用WHILE代替游标的遍历操作
    DECLARE TargetPermissions_ByRoleId_Cursor CURSOR FOR 
使用WHILE代替游标的遍历操作        
SELECT [TargetPermissionId] FROM @tbTargetPermissions 
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
--打开游标
使用WHILE代替游标的遍历操作
    OPEN TargetPermissions_ByRoleId_Cursor
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
--读取游标第一条记录
使用WHILE代替游标的遍历操作
    FETCH NEXT FROM    TargetPermissions_ByRoleId_Cursor INTO @TargetPermissionId
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
--检查@@FETCH_STATUS的值,以便进行循环读取
使用WHILE代替游标的遍历操作
    WHILE @@FETCH_STATUS = 0
使用WHILE代替游标的遍历操作    
BEGIN
使用WHILE代替游标的遍历操作        
EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作        
FETCH NEXT FROM    TargetPermissions_ByRoleId_Cursor INTO @TargetPermissionId;
使用WHILE代替游标的遍历操作    
END
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
--关闭游标
使用WHILE代替游标的遍历操作
    CLOSE TargetPermissions_ByRoleId_Cursor
使用WHILE代替游标的遍历操作    
DEALLOCATE TargetPermissions_ByRoleId_Cursor

改用While后仍然可以遍历执行存储过程 ps_TargetPermissionEntity_Select
使用WHILE代替游标的遍历操作    --把合符条件的目标权限Id加载到一个临时表变量中
使用WHILE代替游标的遍历操作
    DECLARE @tbTargetPermissions    table(IndexId int IDENTITY (01NOT NULL PRIMARY KEY, TargetPermissionId uniqueidentifier NOT NULL)
使用WHILE代替游标的遍历操作    
INSERT INTO @tbTargetPermissions 
使用WHILE代替游标的遍历操作        
SELECT [TargetPermissionId] 
使用WHILE代替游标的遍历操作        
FROM [ps_RolePermissions] 
使用WHILE代替游标的遍历操作        
WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
DECLARE @MaxIndexId int;
使用WHILE代替游标的遍历操作    
SELECT  @MaxIndexId = MAX([IndexId]FROM @tbTargetPermissions--计算最大记录序号,用于遍历列表
使用WHILE代替游标的遍历操作

使用WHILE代替游标的遍历操作    
WHILE @MaxIndexId > -1
使用WHILE代替游标的遍历操作    
BEGIN
使用WHILE代替游标的遍历操作        
DECLARE @TargetPermissionId uniqueidentifier;
使用WHILE代替游标的遍历操作        
SELECT @TargetPermissionId = [TargetPermissionId] FROM @tbTargetPermissions WHERE [IndexId] = @MaxIndexId;
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作        
EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作        
--删除最大记录项,重新判断记录项是否大于-1,以此判断是否遍历完列表
使用WHILE代替游标的遍历操作
        DELETE @tbTargetPermissions WHERE [IndexId] = @MaxIndexId;
使用WHILE代替游标的遍历操作        
SELECT  @MaxIndexId = MAX([IndexId]FROM @tbTargetPermissions 
使用WHILE代替游标的遍历操作        
--SELECT @MaxIndexId--测试(倒序)
使用WHILE代替游标的遍历操作
    END

执行效果相同,就是这里的while与上一方法的排序是相反的,如果对排序顺序有要求的,可以改变一下算法。
按顺序排列的代码如下:
使用WHILE代替游标的遍历操作    --把合符条件的目标权限Id加载到一个临时表变量中
使用WHILE代替游标的遍历操作
    DECLARE @tbTargetPermissions    table(IndexId int IDENTITY (01NOT NULL PRIMARY KEY, TargetPermissionId uniqueidentifier NOT NULL)
使用WHILE代替游标的遍历操作    
INSERT INTO @tbTargetPermissions 
使用WHILE代替游标的遍历操作        
SELECT [TargetPermissionId] 
使用WHILE代替游标的遍历操作        
FROM [ps_RolePermissions] 
使用WHILE代替游标的遍历操作        
WHERE [TargetId] = @TargetId AND [RoleId] = @RoleId
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作    
DECLARE @MinIndexId int;
使用WHILE代替游标的遍历操作    
DECLARE @MaxIndexId int;
使用WHILE代替游标的遍历操作    
SELECT  @MinIndexId = MIN([IndexId]FROM @tbTargetPermissions--计算最小记录序号,用于遍历列表
使用WHILE代替游标的遍历操作
    SELECT  @MaxIndexId = MAX([IndexId]FROM @tbTargetPermissions--计算最大记录序号,用于遍历列表
使用WHILE代替游标的遍历操作

使用WHILE代替游标的遍历操作    
WHILE @MinIndexId <= @MaxIndexId
使用WHILE代替游标的遍历操作    
BEGIN
使用WHILE代替游标的遍历操作        
--SELECT @MinIndexId,@MaxIndexId--测试(顺序)
使用WHILE代替游标的遍历操作
        DECLARE @TargetPermissionId uniqueidentifier;
使用WHILE代替游标的遍历操作        
SELECT @TargetPermissionId = [TargetPermissionId] FROM @tbTargetPermissions WHERE [IndexId] = @MinIndexId;
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作        
EXEC ps_TargetPermissionEntity_Select @TargetPermissionId;
使用WHILE代替游标的遍历操作
使用WHILE代替游标的遍历操作        
--删除最小记录项,重新判断最小记录项是否小于等于最大记录项,以此判断是否遍历完列表
使用WHILE代替游标的遍历操作
        DELETE @tbTargetPermissions WHERE [IndexId] = @MinIndexId;
使用WHILE代替游标的遍历操作        
SELECT  @MinIndexId = MIN([IndexId]FROM @tbTargetPermissions
使用WHILE代替游标的遍历操作    
END

相关文章:

  • 2021-10-27
  • 2021-11-22
  • 2022-12-23
  • 2021-07-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-05-24
  • 2021-06-20
  • 2021-09-23
  • 2022-02-06
  • 2021-06-26
  • 2022-12-23
相关资源
相似解决方案