博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSSQL游标和Fetch
阅读量:4686 次
发布时间:2019-06-09

本文共 2489 字,大约阅读时间需要 8 分钟。

/一般情况下,我们用SELECT这些查询语句时,都是针对的一行记录而言,

如果要在查询分析器中对多行记录(即记录集)进行读取操作时,则需要使用到游标或WHILE等循环
/
以下内容摘自
/
游标的类型:
  1、静态游标(不检测数据行的变化)
  2、动态游标(反映所有数据行的改变)
  3、仅向前游标(不支持滚动)
  4、键集游标(能反映修改,但不能准确反映插入、删除)

游标使用顺序:

   1、定义游标
   2、打开游标
   3、使用游标
   4、关闭游标
   5、释放游标

Transact-SQL:

declare 游标名 cursor [LOCAL | GLOBAL][FORWARD_ONLY | SCROLL][STATIC | KEYSET | DYNAMIC ] [READ_ONLY | SCROLL_LOCKS] 
  for selet语句   [for  update[of 列名[,列名]]
 注:LOCAL 局部游标     GLOBAL 全局游标
     FORWARD_ONLY 仅向前  SCROLL 滚动
     STATIC 静态  KEYSET 键集 DYNAMIC 动态
     READ_ONLY 只读 SCROLL_LOCKS 锁定游标当前行

获取游标的数据

  FETCH [[NEXT | PRIOR | FIRST | LAST |
  ABSOLUTE{ n | @nvar | RELATIVE { n | @nvar}]
  From ] 游标名 [into 变量]
  注:
    NEXT  下一行  PRIOR  上一行  FIRST 第一行
    LAST  最后一行  ABSOLUTE n 第n行
    RELATIVE n 当前位置开始的第n行
    into 变量  把当前行的各字段值赋值给变量

游标状态变量:

    @@fetch_status  游标状态
         0 成功  -1 失败  -2 丢失
    @@cursor_rows 游标中结果集中的行数
        n 行数 -1 游标是动态的  0 空集游标
操作游标的当前行:
   current of 游标名

以下例子,在SQL SERVER 2000 测试成功

use
 pubs
go
declare
 
@auid
 
char
(
12
),
@aulname
 
varchar
(
20
),
@aufname
 
varchar
(
20
), 
@st
 
char
(
2
),
@auinfo
 
varchar
(
50
)
declare
 auth_cur 
cursor
 
for
select
 au_id, au_lname, au_fname, state
from
 authors
open
 auth_cur
fetch
 
next
 
from
 auth_cur 
into
 
@auid
,
@aulname
,
@aufname
@st
while
 (
@@fetch_status
=
0
)
  
begin
    
print
 
'
作者编号: 
'
+
@auid
    
print
 
'
作者姓名: 
'
+
@aulname
+
'
,
'
+
@aufname
    
print
 
'
所在州: 
'
+
@st
    
print
 
'
--------------------------
'
    
fetch
 
next
 
from
 auth_cur 
into
 
@auid
,
@aulname
,
@aufname
@st
  
end
close
 auth_cur
deallocate
 auth_cur

Transact-SQL 游标主要用于存储过程、触发器和Transact-SQL 脚本中,它们使结果集的内容可用于其他Transact-SQL 语句。
/*另一个例子
来自:http://www.cnblogs.com/BillChen/archive/2008/08/21/690180.html
原例子是用于说明如何用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

转载于:https://www.cnblogs.com/totti/archive/2012/10/08/2714891.html

你可能感兴趣的文章
Git Stash用法
查看>>
线程与同步
查看>>
react 路由跳转刷新页面参数消失
查看>>
Android 读取文件内容
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010
查看>>
P1351 联合权值[鬼畜解法]
查看>>
Best Time to Buy and Sell Stock with Cooldown_LeetCode
查看>>
nginx+tomcat反向代理
查看>>
postgressql数据库中limit offset使用
查看>>
linux下如何添加一个用户并且让用户获得root权限
查看>>
搭建Extjs框架(二)
查看>>
NSDateFormatter的说明
查看>>
测试思想-集成测试 关于接口测试 Part 2
查看>>
测试思想-测试设计 史上最详细测试用例设计实践总结 Part1
查看>>
windows下mysql密码忘了怎么办?【转】
查看>>
java文件上传和下载
查看>>
SQL联合查询(内联、左联、右联、全联)的语法(转)
查看>>
枚举和实用类
查看>>