故如虹,知恩;故如月,知明
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
欢迎加群交流技术

sqlserver游标

5089人阅读 2020/9/28 20:14 总访问:3838733 评论: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


游标的分类:

静态游标和动态游标

    

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

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


游标的简单使用:

select * from UserInfo 

--1:创建游标
declare mycursor cursor 
for select username ,number from UserInfo

--2:打开游标
open mycursor

declare @username varchar(64),@number varchar(64),@beforename varchar(64)
--3:查询游标
--fetch next from mycursor into @username,@number
--print(@username+':'+@number)

--3-1:循环遍历这个游标
fetch next from mycursor into @username,@number
--print(@username+':'+@number)

print(@@fetch_status)

while @@fetch_status!=-1
begin
  --取游标的数据
  update UserInfo set UserName='张辽' where Id = 4 
  print(@username+':'+@number)
  fetch next from mycursor into @username,@number
  --查询原表数据
  --select @beforename = username from UserInfo where Id = 4 
  --print(@username+':'+@beforename)
end

--关闭游标
close mycursor
--删除游标
deallocate  mycursor


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

表结构如下:

  --原始工资表
  create Table Account
  (
    Id int primary key identity(1,1),
    MyMoney int,
    AccountNumber nvarchar(64) 
  )
   
  insert Account values(1000,'60023')  
  insert Account values(1000,'60025') 
  insert Account values(1000,'60026')
  
 
 --需要添加工资的表
  create Table AddAccount
  (
    Id int primary key identity(1,1),
    AddMoney int,
    AccountNumber nvarchar(64) 
  )
  insert AddAccount values(2000,'60023')    
  insert AddAccount values(200,'60025')
  insert AddAccount values(500,'60026')

游标的实现如下:

create proc proc_addsalary
 as
 begin
    --处理涨工资的游标
  declare add_salary cursor for select AddMoney,AccountNumber from AddAccount
  open add_salary
  
  declare @AddMoney int ,@AccountNumber nvarchar(64)
  
  --循环处理
  fetch next from add_salary into @AddMoney,@AccountNumber
  
  while @@FETCH_STATUS!=-1
  begin
     --更新原表
     update Account set MyMoney = MyMoney+@AddMoney where AccountNumber = @AccountNumber
     --才能一行一行的读取
     fetch next from add_salary into @AddMoney,@AccountNumber
  end  
  
  close add_salary
   deallocate add_salary
 end


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

多一张绩效表:

--绩效表 
   create Table KPI
  (
    Id int primary key identity(1,1),
    Score int,
    AccountNumber nvarchar(64) ,
    KPIType int --状态为1表示没有增加过薪资
  )
  
  insert KPI values(58,'60023',1)    
  insert KPI values(90,'60025',1)
  insert KPI values(70,'60026',1)

实现代码如下:

     declare dec_KPI cursor for select AccountNumber ,Score,KPIType  FROM KPI
     open dec_KPI
     
     --定义变量 存放需要涨得工资 用户名
     declare @KPI int ,@KPI_score int,@KPI_AccountNumber nvarchar(64),@upMoney int =0
     fetch next from dec_KPI into @KPI_AccountNumber, @KPI_score,@KPI
     
     --循环输出
       while @@FETCH_STATUS=0
       begin
        
        print(@KPI)
        
       --判断状态是否为1则加工资
        if(@KPI=1)
        begin
        
      --判断涨工资多少
			if (@KPI_score>=60 and @KPI_score<=80 )
			begin
				set @upMoney=1000
			end
			if (@KPI_score>80) 
			begin
				set @upMoney=2000
			end 
	         
		 --更新原表
		   update Account set MyMoney = MyMoney+@upMoney where AccountNumber = @KPI_AccountNumber
		   update KPI set KPIType = 0 where AccountNumber = @KPI_AccountNumber
	  end
	  else
	  begin
		print('绩效已核算!!!')
			 --print(@KPI_AccountNumber+ ':'+@KPI_score +':'+@KPI)
		 --一行一行的读取
      end 
      fetch next from dec_KPI into @KPI_AccountNumber, @KPI_score,@KPI 
    end 
    --关闭 删除
     close dec_KPI
     deallocate dec_KPI


欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739

评价