一.在写sql过程中,特别是存储过程里边,会经常用到循环,而游标就是一种特殊的循环,在sql里边。
1.0 我们这里要强调一下,什么情况下,可以使用游标?
2.0 游标在sql里边是相当耗费资源的,所以我们对游标要非常谨慎的使用。
3.0 并不是随随便便就把游标这东西用上来。
大家可以就是说,能确定执行条数,不是几百W或是几十W的情况下,我个人感觉用游标是没什么影响。
大概几W的数据,使用游标还是行得通的,毕竟游标这语法,为我们写业务还是提供了一定的便捷性。
对于写习惯业务系统的开发人员来说,游标这东西并不陌生,因为很多业务都要在数据库里边进行计算与逻辑书写。
特别是单条数据进行循环,然后就对该数据进行各种操作,完成一系列业务之后,最后将数据存入表中。
特别体现在编写存储过程,为避免因游标的语法浪费时间,接下来我就将游标的语法贴出来,方便查看,也方便大家进行开发。
DECLARE @settlememono varchar(30),@contractno varchar(30),@chargecode varchar(30)
,@actstartdate date,@actenddate date,@count int,@settlememono2 varchar(30),@contractno2 varchar(30)
DECLARE cursor_name CURSOR FOR --定义游标
SELECT s.settlememono,contractno,chargecode,startdate,enddate FROM settlememod1 d1
inner join settlememo s on d1.settlememono=s.settlememono
ORDER BY s.lastmodifydate DESC
OPEN cursor_name --打开游标
FETCH NEXT FROM cursor_name INTO @settlememono,@contractno,@chargecode,@actstartdate,@actenddate --抓取下一行游标数据
WHILE @@FETCH_STATUS = 0
BEGIN
select @count=count(1) from settlememod1 d1 inner join settlememo s on d1.settlememono=s.settlememono
where contractno=@contractno and startdate=@actstartdate and enddate=@actenddate and chargecode=@chargecode and d1.settletype='C'
if(@count>1)
begin
select top 1 @settlememono2=s.settlememono,@contractno2=contractno from settlememod1 d1 inner join settlememo s on d1.settlememono=s.settlememono
where contractno=@contractno and startdate=@actstartdate and enddate=@actenddate and chargecode=@chargecode and d1.settletype='C'
order by s.lastmodifydate desc
print @settlememono2 + ',' + @contractno2
end
FETCH NEXT FROM cursor_name INTO @settlememono,@contractno,@chargecode,@actstartdate,@actenddate
END
CLOSE cursor_name --关闭游标
DEALLOCATE cursor_name --释放游标
拿到上边的语法,主要将逻辑填入到中间的循环体,就可以实现一个复杂存储过程的编写。
以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。
要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。
- THE END -
最后修改:2024年1月30日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://alexlee.club/sqlserver-%e6%b8%b8%e6%a0%87%e8%af%ad%e6%b3%95%e5%8f%82%e7%85%a7/2023/01/21/
共有 0 条评论