设为首页 加入收藏

TOP

sqlserver游标概念与实例全面解说(二)
2014-11-23 22:13:38 来源: 作者: 【 】 浏览:22
Tags:sqlserver 游标 概念 实例 全面 解说
from AddSalary

//打开游标
open mycursor

//从游标里取出数据赋值到我们刚才声明的2个变量中
fetch next from mycursor into @O_ID,@A_Salary

//判断游标的状态
//0 fetch语句成功
//-1 fetch语句失败或此行不在结果集中
//-2被提取的行不存在
while (@@fetch_status=0)
begin

//显示出我们每次用游标取出的值
print '游标成功取出一条数据'
print @O_ID
print @A_Salary

//用游标去取下一条记录
fetch next from mycursor into @O_ID,@A_Salary
end
//关闭游标
close mycursor
//撤销游标
deallocate mycursor
GO

通过上面的注释,我想大家都明白了整个游标的创建过程了吧。但是我们现在还是一个抽象的了解,我们学任何知识,都要用于实践,这样才能使抽象的东西变的具体。
那我们就运行这个存储过程,看看游标到底是怎么取值的:
我们打开SQLSERVER2000的查询分析器,制定好数据库后,我们执行存储过程
Exec PK_Test

让我看看效果吧(如图)

\


通过实例我们可以看到游标逐行逐行都把值都取出来了。那么我请大家先不看下面的答案,在引言部分我刚才留个大家的问题试一下能不能解决?
现在我们写一个存储过程解决刚才我留下来的问题吧
CREATE PROCEDURE PK_SalaryAdd
AS
declare @O_ID nvarchar(20),@A_Salary float
declare mycursor cursor for select O_ID,A_Salary from AddSalary
open mycursor
fetch next from mycursor into @O_ID,@A_Salary
while(@@fetch_status = 0)
begin
Update OriginSalary set O_Salary=O_Salary+@A_Salary where O_ID=@O_ID
fetch next from mycursor into @O_ID,@A_Salary
end
close mycursor
deallocate mycursor
GO

按照老方法,我们用查询分析器来执行我们的存储过程,看看结果是怎么样的?
Exec PK_SalaryAdd
让我看看效果吧(如图)

\


执行存储过程,看到我们影响了3行数据


用sql语句,看看表OriginSalary现在的结果:

\


1.4 结束语
很高兴大家能把这个教程看完,其实这只是游标的最最基础的一个应用,显示生活的逻辑的关系中,可能有更复杂的游标。但是我们只有学会走路,才能跑步嘛,o(∩_∩)o…。

**********************************************

其实SQL中有一个函数可以取得ROWNUMBER值,不过得指定排序的字段,代码如下:

SELECT * FROM (
SELECT ROW_NUMBER() OVER(ORDER BY O_ID) AS ROW_NO,* FROM OriginSalary
) TT
WHERE TT.ROW_NO > 4

如果让我从第五行开始取数据,我会使用TOP而不是用游标

SELECT * FROM OriginSalary
WHERE O_ID NOT IN (
SELECT TOP 4 O_ID FROM OriginSalary
)

再有一个,博文中的更新语句,不用游标,也不用程序,直接用SQL可以快速简单的解决:

UPDATE V1
SET V1.O_Salary=ISNULL(V1.O_Salary,0)+ISNULL(V2.A_Salary,0)
FROM OriginSalary V1
RIGHT JOIN AddSalary V2 ON V1.O_ID=V2.A_ID

注:我在这里并没有反驳楼主的意思,只是提提我的做法而已。

浪鹰
很好,等会加你个好友,呵呵
但是关于
SELECT * FROM OriginSalary
WHERE O_ID NOT IN (
SELECT TOP 4 O_ID FROM OriginSalary
)
这个我不太认可,性能太慢,现在第5条还好说,NOT IN 只要去匹配前4条数据,但是从第500条数据开始呢,SELECT * FROM OriginSalary
WHERE O_ID NOT IN (
SELECT TOP 500 O_ID FROM OriginSalary
)
NOT IN 只要去匹配前500条数据吗
我是IN 和NOT IN的坚实反对者,反正能用别的方法代替的,我都会不用这个,太影响性能。

我的SQL 太烂 最近在学习存储过程,呵呵!
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Sql server游标简析 下一篇微软SQL Server数据库的两种请求..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: