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
查看全文
相关阅读:
numpy百题冲关,pandas百题冲关
mapreduce过程以及相关类总结
mapreduce,数据结构和类型介绍
精确度、召回率、混淆矩阵的关系
小程序点击图片放大效果 单张图片 多张图片
小程序动态添加class及调接口传递多个参数
小程序for循环嵌套
小程序富文本转换
jquery函数加载及生成随机数
微信小程序 swiper 显示图片计数 当前/总数
原文地址:https://www.cnblogs.com/chenjunbiao/p/1760240.html
最新文章
angularjs指令实现轮播图----swiper
angularjs中阻止事件冒泡,以及指令的注意点
js控制高度自适应,做到响应式
Angularjs给动态生成的元素绑定事件
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class android.sup
SSH项目的pom.xml文件
Maven项目管理工具
使用Java API连接和操作HBase数据库
部署Dubbo监控中心
虚拟机中克隆后使用eth0
热门文章
CentOS 6 安装HBase集群教程
CentOS 6 安装Hadoop集群
Linux下安装zookeeper集群
Centos6离线安装MySQL5.5.55-1(附带安装包及Perl依赖包)
文件系统各个文件夹的作用说明
用户权限提升命令,提升到管理员usermod命令,文件所有权变更chown,文件权限变更
用户权限提升命令,提升到管理员usermod命令
为什么沿着梯度反方向就是下降的
新的学习路径:基于泰迪云课程,对数据分析和数据建模,机器学习算法进行统筹,接着是基于大数据的数据挖掘
numpy百题冲关,pandas百题冲关, numpy-100库直接线上生成和训练,使用google云上notebook环境
Copyright © 2011-2022 走看看