MSSQL之游标的用法

转自:http://blog.csdn.net/chinajiyong/article/details/7280699

再来看看MSSQL中的游标。

我们知道所有SQL语句都在行集上运行。SELECT语句返回包含所有满足SELECT语句限定条件的行的完整结果集。应用程序需要一次处理结果集的一行或一个行块。游标是结果集的逻辑扩展,它使应用程序得以逐行处理结果集。
SQL SERVER支持多种指定游标的机制: 
1、Transact-SQL支持用于管理游标的SQL-92 DECLARE CURSOR、OPEN、FETCH 和CLOSE语句。Transact-SQL还支持游标扩展,如: 
  (1)、允许对重新使用游标进行优化的DEALLOCATE语句。//删除游标
  (2)、定义Transact-SQL变量以具有游标数据类型,然后用它引用游标。
  (3)、定义具有局部或全局作用域的游标。
  (4)、在DECLARE CURSOR 语句内指定符合OLE DB和ODBC规范的游标类型(FORWARD_ONLY、STATIC、KEYSET和  DYNAMIC)。 
2、用于SQL Server的Microsoft OLE DB 提供程序支持ADO和OLE DB API的游标功能。
3、Microsoft SQL Server ODBC驱动程序支持ODBC、RDO、DAO和Microsoft基础类数据库类API的游标功能。
4、用于C语言的Microsoft嵌入式SQL支持嵌入式SQL标准的游标功能。
5、DB-Library API支持与OLE DB和ODBC API相同级别的游标功能。 

  1. 首先,我们创建一个银行信息表  
  2. IF OBJECT_ID('bankInfo'IS NOT NULL   
  3. DROP TABLE bankInfo  
  4. GO  
  5. --银行卡信息表  
  6. CREATE TABLE bankInfo  
  7. (  
  8.    uId VARCHAR(18) NOT NULL PRIMARY KEY,--卡号  
  9.    uName VARCHAR(20), --卡主姓名  
  10.    uMoney MONEY       --卡中余额  
  11. )  
  12. GO  
  13. INSERT INTO bankInfo VALUES('9559901','张三',1)  
  14. INSERT INTO bankInfo VALUES('9559902','李四',1000)  
  15. INSERT INTO bankInfo VALUES('9559903','王五',800)  
  16. INSERT INTO bankInfo VALUES('9559904','赵六',50)  
  17. INSERT INTO bankInfo VALUES('9559905','赵明',5)  
  18.   
  19. SELECT * FROM bankInfo,结果显示如下:  
  20. /*  
  21. uId                uName                uMoney  
  22. ------------------ -------------------- ---------------------  
  23. 9559901            张三                   1.00  
  24. 9559902            李四                   1000.00  
  25. 9559903            王五                   800.00  
  26. 9559904            赵六                   50.00  
  27. 9559905            赵明                   5.00  
  28.   
  29. (5 行受影响)  
  30. */  
  1. <span style="font-size:16px; ">创建了游标之后,必须要打开才能使用,还是用T-SQL举个示例来说明一下游标的使用</span>  
  1. -----------游标的使用----------------  
  2. DEALLOCATE CursorBank  --删除游标  
  3. GO  
  4. --------定义游标-----------------  
  5. DECLARE CursorBank CURSOR SCROLL    
  6. FOR SELECT * FROM bankInfo  
  7. GO  
  8. OPEN CursorBank --从游标读取数据前必须先打开游标  
  9. FETCH FIRST FROM CursorBank  --读取第一行  
  10. /*  
  11. uId                uName                uMoney  
  12. ------------------ -------------------- ---------------------  
  13. 9559901            张三                   401.00  
  14.   
  15. (1 行受影响)  
  16. */  
  17.   
  18. FETCH NEXT FROM CursorBank   --上次读取行的下一行  
  19. /*  
  20. uId                uName                uMoney  
  21. ------------------ -------------------- ---------------------  
  22. 9559902            李四                   600.00  
  23.   
  24. (1 行受影响)  
  25. */  
  26.   
  27. FETCH PRIOR FROM CursorBank  --上次读取行的上一行  
  28. /*  
  29. uId                uName                uMoney  
  30. ------------------ -------------------- ---------------------  
  31. 9559901            张三                   401.00  
  32.   
  33. (1 行受影响)  
  34. */  
  35.   
  36. FETCH LAST FROM CursorBank   --最后一行  
  37. /*  
  38. uId                uName                uMoney  
  39. ------------------ -------------------- ---------------------  
  40. 9559905            赵明                   5.00  
  41.   
  42. (1 行受影响)  
  43. */  
  44.   
  45. FETCH ABSOLUTE 2 FROM CursorBank --定位到第三行  
  46. /*  
  47. uId                uName                uMoney  
  48. ------------------ -------------------- ---------------------  
  49. 9559902            李四                   600.00  
  50.   
  51. (1 行受影响)  
  52. */  
  53.   
  54. FETCH RELATIVE -1 FROM CursorBank --相对位置定位,根据当前游标位置  
  55. /*  
  56. uId                uName                uMoney  
  57. ------------------ -------------------- ---------------------  
  58. 9559901            张三                   401.00  
  59.   
  60. (1 行受影响)  
  61. */  
来看一个综合点的游标应用
--通过游标读取数据,如果余额大于等于500,
--则显示该储户为贵宾客户
--全局变量@@FETCH_STATUS表示上一个FETCH是否读取
--到了数据,其返回值类型为int型
--  值有三种:
--   0 : FETCH语句成功
--  -1 : FETCH语句失败或此行不在结果集中
--  -2 : 被提取行不存在
sql语句如下:

  1. DECLARE @id VARCHAR(12),@name VARCHAR(20)  
  2. DECLARE @getMoney MONEY  
  3. FETCH FIRST FROM CursorBank INTO @id,@name,@getMoney  
  4. WHILE @@FETCH_STATUS=0 --上一个fetch是否读取到了数据  
  5.     BEGIN   
  6.       IF(@getMoney>500)  
  7.         PRINT '你是VIP用户'+',账号:'+@id+',姓名:'+@name+',账户余额:'+CONVERT(VARCHAR(12),@getMoney)  
  8.       ELSE  
  9.         PRINT @name+',您不是VIP用户!'      
  10.       FETCH NEXT FROM CursorBank INTO @id,@name,@getMoney  
  11.     END  
  12. 运行结果如下:  
  13. /*  
  14. 张三,您不是VIP用户!  
  15. 你是VIP用户,账号:9559902,姓名:李四,账户余额:600.00  
  16. 你是VIP用户,账号:9559903,姓名:王五,账户余额:800.00  
  17. 赵六,您不是VIP用户!  
  18. 赵明,您不是VIP用户!  
  19. */  
   以上是关于MSSQL中游标的简单示例,我只是简单总结一下,新手可以看看,SQL高手就没必要了。写的不对的地方欢迎批评指正。关于游标的高级用法还是得在项目中慢慢积累和学习。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值