加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver游标使用和循环

发布时间:2020-12-12 13:43:35 所属栏目:MsSql教程 来源:网络整理
导读:[sql] ? view plain ?copy ?print ? /***?? 游标的使用?? ?讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。?? ?使用游标的顺序:?声名游标、打开游标、读取数据、关闭游标、删除游标。?? 1.3.1声明游标?? 最简单游标声明: DECLARE ?游标名 C
[sql]? view plain ?copy ?print ?
  1. /***??
  2. 游标的使用??
  3. ?讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。??
  4. ?使用游标的顺序:?声名游标、打开游标、读取数据、关闭游标、删除游标。??
  5. 1.3.1声明游标??
  6. 最简单游标声明:DECLARE?<游标名>CURSOR?FOR<SELECT语句>;??
  7. 其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询??
  8. 例子:[已表2?AddSalary为例子]??
  9. Declare?mycursor?cursor?for?select?*?from?AddSalary??
  10. 这样我就对表AddSalary申明了一个游标mycursor???
  11. 【高级备注】??
  12. DECLARE?<游标名>?[INSENSITIVE]?[SCROLL]?CURSORFOR<SELECT语句>??
  13. 这里我说一下游标中级应用中的[INSENSITIVE]和[SCROLL]??
  14. INSENSITIVE??
  15. 表明MS?SQL?SERVER?会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb?数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。??
  16. 另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE?选项。??
  17. a.在SELECT?语句中使用DISTINCT、?GROUP?BY、?HAVING?UNION?语句;??
  18. b.使用OUTER?JOIN;??
  19. c.所选取的任意表没有索引;??
  20. d.将实数值当作选取的列。??
  21. SCROLL??
  22. 表明所有的提取操作(如FIRST、?LAST、?PRIOR、?NEXT、?RELATIVE、?ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT?提取操作。由此可见,SCROLL?极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再??
  23. 重开游标。???
  24. 1.3.2?打开游标??
  25. 非常简单,我们就打开刚才我们声明的游标mycursor??
  26. OPEN?mycursor???
  27. 1.3.3读取数据??
  28. FETCH?[?NEXT?|?PRIOR?|?FIRST?|?LAST]?FROM?{?游标名??|?@游标变量名?}?[?INTO?@变量名?[,…]?]??
  29. 参数说明:??
  30. NEXT???取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH?NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。??
  31. INTO?@变量名[,…]??把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。??
  32. 现在我们就取出mycursor游标的数据吧!???
  33. 当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:??
  34. Eg:?Fetch?next?from?mycursor?或则?Fetch?first?from?mycursor??
  35. 这样我就取出了游标里的数据,但是光光这样可不够,我们还需要将取出的数据赋给变量??
  36. --声明2个变量??
  37. declare?@O_ID?NVARCHAR(20)??
  38. declare?@A_Salary?float??
  39. --将取出的值传入刚才声明的2个变量??
  40. Fetch?next?from?mycursor?into?@?O_ID,@?A_Salary??
  41. ???
  42. 1.3.4关闭游标??
  43. CLOSE?mycursor?????
  44. ???????????
  45. 1.3.5删除游标??
  46. DEALLOCATE?mycursor???????????
  47. 1.3.6?实例训练??
  48. **/??
  49. CREATE?PROCEDURE?PK_Test??
  50. AS??
  51. ???? ????declare?@O_ID?nvarchar(20)????
  52. ????declare?@A_Salary?float????
  53. ????--声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同??
  54. ????declare?mycursor?cursor?for?select?O_ID,A_Salary?from?AddSalary????
  55. --打开游标??
  56. ????open?mycursor??????
  57. --从游标里取出数据赋值到我们刚才声明的2个变量中??
  58. ????fetch?next?from?mycursor?into?@O_ID,@A_Salary??????
  59. --判断游标的状态??
  60. --?0?fetch语句成功??????
  61. ---1?fetch语句失败或此行不在结果集中??????
  62. ---2?被提取的行不存在??
  63. ????while?(@@fetch_status=0)??
  64. ????begin??????
  65. --显示出我们每次用游标取出的值??
  66. ???????print?'游标成功取出一条数据'??
  67. ???????print?@O_ID??
  68. ???????print?@A_Salary?????
  69. --用游标去取下一条记录??
  70. ???????fetch?next?from?mycursor?into?@O_ID,@A_Salary??
  71. ????end??
  72. --关闭游标??
  73. ????close?mycursor??
  74. --撤销游标??
  75. ????DEALLOCATE?mycursor???
  76. GO ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读