应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

sqlserver游标

6562人阅读 2020/9/28 20:14 总访问:5192105 评论:4 收藏:1 手机
分类: 数据库


什么是游标:

 游标类似于一个指针,游标就是把数据结果放到内存中,然后游标指向这个内存地址


作用:
可以让我们一行一行的去处理数据, 类似c# ado.net SqlDataReader 可以提供一行一行的读取数据

可以把游标理解成数据库中的SqlDataReader,这样就可以在数据库中处理一些比较复杂的逻辑


使用游标的步骤:

1:创建游标  declare 游标名字 cursor for ....接语句

2:打开游标  open 游标名字

3:查询游标(可以是遍历)    fetch next from 游标名称 into 变量

4:关闭游标  close 游标名字

5:删除游标  deallocate 游标名字


@@fetch_status:查询游标有没有读完,如果是-1就说明游标读完了,

注意:游标打开的初始@@fetch_status也是等于-1,没有读取的时候是-1,读取完了也是-1


游标的分类:

静态游标和动态游标

    

动态游标:主表数据变了, 游标数据会跟着变

静态游标:主表数据变了, 游标数据不会跟着变


游标的简单使用:

  1. select * from UserInfo 
  2. --1:创建游标
  3. declare mycursor cursor 
  4. for select username ,number from UserInfo
  5. --2:打开游标
  6. open mycursor
  7. declare @username varchar(64),@number varchar(64),@beforename varchar(64)
  8. --3:查询游标
  9. --fetch next from mycursor into @username,@number
  10. --print(@username+':'+@number)
  11. --3-1:循环遍历这个游标
  12. fetch next from mycursor into @username,@number
  13. --print(@username+':'+@number)
  14. print(@@fetch_status)
  15. while @@fetch_status!=-1
  16. begin
  17.   --取游标的数据
  18.   update UserInfo set UserName='张辽' where Id = 4 
  19.   print(@username+':'+@number)
  20.   fetch next from mycursor into @username,@number
  21.   --查询原表数据
  22.   --select @beforename = username from UserInfo where Id = 4 
  23.   --print(@username+':'+@beforename)
  24. end
  25. --关闭游标
  26. close mycursor
  27. --删除游标
  28. deallocate  mycursor


游标实现薪资添加:
游标实现工资的添加,比如有一张原始工资表,还有一张对应需要添加薪水的表,我们可以利用游标能一行一行处理数据的能力轻松的实现

表结构如下:

  1.   --原始工资表
  2.   create Table Account
  3.   (
  4.     Id int primary key identity(1,1),
  5.     MyMoney int,
  6.     AccountNumber nvarchar(64
  7.   )
  8.    
  9.   insert Account values(1000,'60023')  
  10.   insert Account values(1000,'60025'
  11.   insert Account values(1000,'60026')
  12.   
  13.  
  14.  --需要添加工资的表
  15.   create Table AddAccount
  16.   (
  17.     Id int primary key identity(1,1),
  18.     AddMoney int,
  19.     AccountNumber nvarchar(64
  20.   )
  21.   insert AddAccount values(2000,'60023')    
  22.   insert AddAccount values(200,'60025')
  23.   insert AddAccount values(500,'60026')

游标的实现如下:

  1. create proc proc_addsalary
  2.  as
  3.  begin
  4.     --处理涨工资的游标
  5.   declare add_salary cursor for select AddMoney,AccountNumber from AddAccount
  6.   open add_salary
  7.   
  8.   declare @AddMoney int ,@AccountNumber nvarchar(64)
  9.   
  10.   --循环处理
  11.   fetch next from add_salary into @AddMoney,@AccountNumber
  12.   
  13.   while @@FETCH_STATUS!=-1
  14.   begin
  15.      --更新原表
  16.      update Account set MyMoney = MyMoney+@AddMoney where AccountNumber = @AccountNumber
  17.      --才能一行一行的读取
  18.      fetch next from add_salary into @AddMoney,@AccountNumber
  19.   end  
  20.   
  21.   close add_salary
  22.    deallocate add_salary
  23.  end


使用游标分等级涨的薪资
根据用户绩效表实现添加工资
用户绩效考核(KPI)在60分以下就不涨工资,如果成绩在60-80加1000,如果在80以上加2000

多一张绩效表:

  1. --绩效表 
  2.    create Table KPI
  3.   (
  4.     Id int primary key identity(1,1),
  5.     Score int,
  6.     AccountNumber nvarchar(64) ,
  7.     KPIType int --状态为1表示没有增加过薪资
  8.   )
  9.   
  10.   insert KPI values(58,'60023',1)    
  11.   insert KPI values(90,'60025',1)
  12.   insert KPI values(70,'60026',1)

实现代码如下:

  1.      declare dec_KPI cursor for select AccountNumber ,Score,KPIType  FROM KPI
  2.      open dec_KPI
  3.      
  4.      --定义变量 存放需要涨得工资 用户名
  5.      declare @KPI int ,@KPI_score int,@KPI_AccountNumber nvarchar(64),@upMoney int =0
  6.      fetch next from dec_KPI into @KPI_AccountNumber, @KPI_score,@KPI
  7.      
  8.      --循环输出
  9.        while @@FETCH_STATUS=0
  10.        begin
  11.         
  12.         print(@KPI)
  13.         
  14.        --判断状态是否为1则加工资
  15.         if(@KPI=1)
  16.         begin
  17.         
  18.       --判断涨工资多少
  19. if (@KPI_score>=60 and @KPI_score<=80 )
  20. begin
  21. set @upMoney=1000
  22. end
  23. if (@KPI_score>80
  24. begin
  25. set @upMoney=2000
  26. end 
  27.          
  28.  --更新原表
  29.    update Account set MyMoney = MyMoney+@upMoney where AccountNumber = @KPI_AccountNumber
  30.    update KPI set KPIType = 0 where AccountNumber = @KPI_AccountNumber
  31.   end
  32.   else
  33.   begin
  34. print('绩效已核算!!!')
  35.  --print(@KPI_AccountNumber+ ':'+@KPI_score +':'+@KPI)
  36.  --一行一行的读取
  37.       end 
  38.       fetch next from dec_KPI into @KPI_AccountNumber, @KPI_score,@KPI 
  39.     end 
  40.     --关闭 删除
  41.      close dec_KPI
  42.      deallocate dec_KPI


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

雨雨雨雨辰

2020/10/13 14:50:42

1

2020/10/13 19:59:16 回复

Session

2021/3/18 9:31:54

发现了好东西,收藏了

剑轩:@Session嘿嘿嘿!

2021/3/18 16:29:26 回复

sqlserver order by

order by 字段名order by 第几个字段(整形)order by 排序:order by 字段名:通过字段名指定的字段排序 order by 字段数...

sqlserver保障远程连接的安全性

如果是只读的话建个视图,建个普通用户只对该视图进行读。读写的话就只能自己在加一层代理服务,由代理来进行读写,各客户...

sqlserver约束

添加表后操作约束--删除约束 altertableaj_testdropconstraintCK__aj_test__userAge__5EBF139D --为表aj_test添加默认...

sqlserver存储过程拼接sql语句,分页

在写有些存储过程的时候需要进行sql的拼接,然后在使用exec函数执行sql语句注意字符串的拼接,看下面一段存储过程的sql语句...

sqlserver常用操作

创建临时表createtable#表名() select字段1,字段2....字段ninto#表名from表[where1=1]删除临时表ifOBJECT_ID(&#39;tempdb....

Serilog日志记录到sqlserver以及其中存在的问题

1.首先来一大串的安装Install-PackageSerilog //控制台输出 Install-PackageSerilog.Sinks.Console //文件输出 Install...

sqlserver监控sql语句

首先在工具中打开sql server profiler然后登录一下这里可以进行一些常规的筛选,不然监控的sql语句很多的右下方还可以进行...

sqlserver数据库+DBHelper

原始的ASP.NET数据库查询,所需要的帮助类publicclassDBHelper {//创建全局对象 staticSqlConnectionconn=newSqlConnecti...

Core使用codefirst创建sqlserver数据库

1.先添加以下程序包Install-PackageMicrosoft.EntityFrameworkCore Install-PackageMicrosoft.EntityFrameworkCore.SqlSer...

sqlserver ROW_NUMBER 分页

很简单的一个sql语句根据行号分页即可 select * from (select *,ROW_NUMBER() over(order by id) as rownumber from[dbo]....

sqlserver跨库复制表

sql语句:select*intoResourcefromXJ.[dbo].[Resource]注意主键、外键、约束、触发器、索引都不会被复制,只是数据会被复制...

sqlserver基础查询

select top 1 from table1 //————返回表中第一条数据 select top 10 percent * from table1 //...

sqlserver存储过程

什么是存储过程: 预编译的sql语句,可以放很多sql语句,里边可以写条件,循环,可以把一些逻辑放到存储过程里边处理 比如...

sqlserver函数

函数系统自带函数(avg,sum,min,max,count),用户自定义函数 系统分类:表值函数,标量值函数,聚合函数 函数语法:函数必...

sqlserver事务

事务:把所有的操作当中一个整体,要么全部成功,要么全部失败 一旦开启了事务所有的操作都是临时的,你可以选择提交或者...

sqlserver触发器

触发器什么是触发器:触发器是个特殊的存储过程,不是由用户触发,是系统根据事件来触发。对表操作比如 添加,删除,...