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
查看全文
相关阅读:
课程作业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
最新文章
Gui图形化界面
爬虫
python list
【.net ajax显示后台返回值】
用Nacos做微服务架构里的服务注册与发现中心
通过docker安装elasticsearch和安装ik分词器插件及安装kibana
docker常用命令总结
win10安装docker运行环境
ElasticSearch总结
阿里云RocketMQ的消费者简单实现
热门文章
阿里云RocketMQ的生产者简单实现
SpringCloud消息总线
SpringCloud服务注册与发现
SpringCloud-分布式配置中心(基于SpringBoot2.X)
四则运算1
构建之法阅读笔记01
课程存储校对:程序设计思想、源程序代码、运行结果截图,以及开发过程中的项目计划日志、时间记录日志、缺陷记录日志(PSP0级记录)。
JavaWeb连接SQLServer数据库并完成一个登录界面及其功能设计。
课程作业10:异常处理课件中动手动脑的相关问题。
课程作业09:继承与多态课件中动手动脑的相关问题。
Copyright © 2011-2022 走看看