1. -------------------------------------------------------------------------------------  
2. ------------------------------------游标的实例---------------------------------------  
3. -------------------------------------------------------------------------------------  
4. --游标的概念  
5. --游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。  
6. --游标的优点  
7. --从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:  
8. --1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。  
9. --2)提供对基于游标位置的表中的行进行删除和更新的能力。  
10. --3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。  
11.   
12. --FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项  
13. --SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动  
14.   
15. --游标的操作步骤:  
16. --1.声明游标  
17. --2.打开游标  
18. --3.读取数据  
19. --4.关闭游标  
20. --5.释放游标  
21.   
22.   
23. declare @name varchar(50)  
24. declare st_cursor scroll cursor for select empName from Tab_Salary   --声明游标  
25. open st_cursor      --打开游标  
26.   
27. --读取数据  
28. --取第一行  
29. fetch first from st_cursor into @name   
30. print @name  
31.   
32. --取最后一行  
33. fetch last from st_cursor into @name  
34. print @name  
35.   
36. --取下一行  
37. fetch next from st_cursor into @name  
38. print @name  
39.   
40. --取上一行  
41. fetch prior from st_cursor into @name  
42. print @name  
43.   
44. --取第二行【absolute(n):跳到第n行】  
45. fetch absolute 2 from st_cursor into @name  
46. print @name  
47.   
48. --取上一行【relative(n):相对当前位置取第n行,-1当前位置的上一行,1当前位置下一行,如果超出n行,则为当前行数据】  
49. fetch relative -1 from st_cursor into @name  
50. print @name  
51.   
52. close st_cursor     --关闭游标  
53. deallocate st_cursor --释放游标  
54.   
55.   
56. ------------------------------------实战练习-----------------------------------------  
57. --我们先建两张表  
58. --工资表  
59. create table Tab_Salary  
60. (  
61. int identity(1,1),  
62. varchar(20) primary key,    
63. varchar(50),  
64. decimal(18,2)  
65. )  
66.   
67. insert into Tab_Salary values('A001','陈飞刚',1000.50),  
68. 'B001','杨帆',900.50),  
69. 'C001','吴磊',750.80)                             
70. go  
71.   
72. --额外工资表  
73. create table Tab_Extra_Salary  
74. (  
75. int identity(1,1),  
76. varchar(20),  
77. decimal(18,2)  
78. )  
79. insert into Tab_Extra_Salary values('A001',200.00),  
80. 'B001',100.50),  
81. 'C001',600.80),  
82. 'B001',800.00)                              
83. go  
84.   
85. --现在我们做一个简单的练习:用游标打印出额外工资表Extra_Salary的数据  
86. create proc pro_cursor  
87. as  
88. declare @empId varchar(20)  
89. declare @Extr_Salary decimal(18,2)  
90. declare mycursor cursor for select empId,Extr_Salary from Tab_Extra_Salary --声明游标  
91. open mycursor  --打开游标  
92. fetch next from mycursor into @empId,@Extr_Salary  
93. while(@@FETCH_STATUS=0)  --遍历所有的数据  
94. begin  
95. '游标成功取出一条数据!'  
96.     print @empId  
97.     print @Extr_Salary  
98.       
99. fetch next from mycursor into @empId,@Extr_Salary  --取下一条游标数据  
100. end  
101. close mycursor --关闭游标  
102. deallocate mycursor --删除游标  
103. go  
104.   
105. exec pro_cursor  
106. go  
107.   
108. --加强练习:将工资表中员工的工资与该员工额外工资表中的额外工资对应的计算总和,然后在工资表中Salary显示出来  
109. --说简单点:Salary=Salary+Extr_Salary  
110. create proc pro_Salary  
111. as  
112. declare @empId varchar(20)  
113. declare @Extr_Salary decimal(18,2)  
114. declare extrSalary_cursor cursor for select empId,Extr_Salary from Tab_Extra_Salary   
115. open extrSalary_cursor  
116. fetch next from extrSalary_cursor into @empId,@Extr_Salary  
117. while(@@FETCH_STATUS=0)  
118. begin  
119. update Tab_Salary set Salary=Salary+@Extr_Salary where empId=@empId  
120. fetch next from extrSalary_cursor into @empId,@Extr_Salary   
121. end  
122. close extrSalary_cursor  
123. deallocate extrSalary_cursor  
124. go  
125.   
126. exec pro_Salary  
127. go  
128. --来看看刚刚游标执行的效果有没有加上去  
129. select * from Tab_Salary  
130. go