关于sqlserver存储过程用游标循环的问题,如何解决?

通过ROC_UserLoginInfo表查询到的如图的信息去循环添加

img

获取到如下图的数据

img

USE [ShopFlow]
GO
/****** Object:  StoredProcedure [dbo].[SFROC_UserLogininfoinfo]    Script Date: 2023-3-29 14:27:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER procedure [dbo].[SFROC_UserLogininfoinfo](@DateFrom datetime,@DateTo datetime)
as

declare @Bomname nvarchar(50)
declare @DateFrom1 nvarchar(50)
declare @DateTo1 nvarchar(50)
declare @DateF nvarchar(50)
declare @DateT nvarchar(50)


select @DateFrom1=@DateFrom+'00:00:00.000'
select @DateTo1=@DateTo+'23:59:59.000'

select @DateF = convert(char(10),@DateFrom1,121)
select @DateT = convert(char(10),@DateTo1 ,121)

declare @aa nvarchar(4000)
declare @aa1 nvarchar(4000)

Create Table #aa
(
   ID int,
   CrtUser nvarchar(50),
   CrtDate datetime,
   UserName nvarchar(50),
   LoginDate datetime,
   LogoutDate datetime,
   jobNo nvarchar(50),
   ProcessID nvarchar(50),
   MachineID nvarchar(50),
   WoQty int,
   Rtype nvarchar(50),
   Remarks nvarchar(1000),
   UpdUser nvarchar(50),
   UpdDate datetime
)

Create Table #tt
(
   ID int,
   JobNo nvarchar(50),
   ItemCode nvarchar(50),
   ProcessID nvarchar(50),
   MachineID nvarchar(50),
   TotalUsers int,
   LoginDate datetime,
   LogoutDate datetime,
   MinutesSpend int,
   Qty int,
   num1 nvarchar(50),
   num2 nvarchar(50)
)

--获取当天的所有已经登出的信息
select @aa='Insert into #aa select * from ROC_UserLogininfo where LogoutDate between '''+@DateF+'''  and '''+@DateT+'''  order by LogoutDate '
exec(@aa)

declare @numm int
declare @mprmun nvarchar(50)
declare @timenum nvarchar(50)
declare @qtynum nvarchar(50)
declare @mmnum1 int
declare @mmnum2 int
declare @mmnum3 nvarchar(50)
declare @mmnum4 int
declare @mmnum5 nvarchar(50)

declare @JOBNO nvarchar(50),@MachineID nvarchar(50),@Logintime datetime,@Logouttime datetime,@ProcessID nvarchar(50)
declare temp_aa cursor for select @JOBNO,@MachineID,@Logintime,@Logouttime,@ProcessID from #aa
open temp_aa
fetch next from temp_aa into @JOBNO,@MachineID,@Logintime,@Logouttime,@ProcessID
while @@fetch_status<>-1
begin
     --获取Bom名称
     select @Bomname=BOMNO from SFBSJOBProcedure where JobNo=@JOBNO
     if(@Bomname<>'')
     begin
          --获取当前时间段该机种的工作人数
          select @mprmun=count(*) from ROC_UserLoginInfo where Rtype=0 and MachineID=@MachineID and Jobno=@JOBNO
          if(@mprmun<>'')
          begin
               --获取总工作时间
               select distinct @timenum=datediff(minute, @Logintime,@Logouttime)
               if(@timenum<>'')
               begin
                    --获取时间段内该机种人员的完成数量
                    select @qtynum=SUM(QTY) from SFDetails(NOLOCK) where JOBNO=@JOBNO AND ProcessID=@ProcessID AND MachineName=@MachineID and CrtDate between @Logintime and @Logouttime
                    if(@qtynum<>'')
                    begin
                         --计算Qty/Minute
                         select @mmnum1=cast(@timenum as int)
                         select @mmnum2=cast(@qtynum as int)
                         select @mmnum3=CONVERT(FLOAT,@mmnum2) / CONVERT(FLOAT,@mmnum1)
                         if(@mmnum3<>'')
                         begin
                              --计算Qty/Min/Person
                              select @mmnum4=cast(@mmnum3 as int)
                              select @mmnum5=CONVERT(FLOAT,@mmnum2) / CONVERT(FLOAT, @mmnum1) / CONVERT(FLOAT,@mmnum4)
                              if(@mmnum5<>'')
                              begin
                                   select @numm=COUNT(*) from ROC_UserLoginInfo1 where LoginDate=@Logintime and LogoutDate=@Logouttime and JobNo=@JOBNO
                                   if(@numm<=0)
                                   begin
                                           insert into ROC_UserLoginInfo1 (JobNo,ItemCode,ProcessID,MachineID,TotalUsers,LoginDate,LogoutDate,MinutesSpend,Qty,num1,num2)
                                        values(@JOBNO,@Bomname,@ProcessID,@MachineID,@mprmun,@Logintime,@Logouttime,@timenum,@qtynum,@mmnum3,@mmnum5)
                                        fetch next from temp_aa into @JOBNO,@MachineID,@Logintime,@Logouttime,@ProcessID
                                   end
                              end
                         end
                    end
               end
          end
     end
end
close temp_aa 
deallocate temp_aa

select * from ROC_UserLoginInfo1 where LogoutDate between @DateF and @DateT order by LogoutDate

SQL看起来太复杂,请介绍下你的需求,或许有其它简单的解决方案。

。。。。。。。。。。。。。这么多层 if ?不明白你要干什么了

说需求,贴代码内容的数据用例,放期待结果,说明你想用游标干什么