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
(
0
,
1
)
NOT
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
(
0
,
1
)
NOT
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
查看全文
相关阅读:
myeclipse10集成Tomcat6时出现错误
myeclipse10.0如何集成Git
java中Integer在JDK1.6和JDK1.7中的区别
Git简介和安装
Git配置的用户名密码在本地的存贮位置
关于ActiveMQ接收端停止接收的方法
eclipse集成SVN插件-----复制添加插件
【Python3之常用模块】
【Python中if __name__ == '__main__': 的解析】
【Python3之面向对象的程序设计】
原文地址:https://www.cnblogs.com/chenjunbiao/p/1760240.html
最新文章
http 和 soap 关系
Java解析XML的四种方法详解
如何查看eclipse、mysql的版本
Spring Boot 发布方法
Spring Boot 热部署的实现
JDK环境变量配置问题
JAVA中的数据存储(堆及堆栈)- 转载
配置tomcat,访问端口改为80
SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
往文件中写数据--增量
热门文章
如何退出 vim
tomcat配置访问图片路径映射到磁盘路径
Windows服务器从Linux服务器上以FTP形式获取图片
如何设置Tomcat的JVM虚拟机内存大小
Linux搭建FTP服务器实战
查看Linux版本信息
局域网如何通过SSH连接虚拟机装的centOS系统
win10安装VMware
Windows10搭建FTP服务器
Git检出远程库的分支等相关操作
Copyright © 2011-2022 走看看