sqlserver 存储过程 游标 双层循环

循环查询近12个月每个月不同的部门的数据

ALTER PROCEDURE [dbo].[proc存储过程名称]
    
AS
BEGIN
select distinct TeamName,teamid,OrderNo from Table1(部门) where ParentID=0 and teamid<>60 and isdel=0 order by OrderNo ;
select convert(varchar(7),dateadd(mm,number,dateadd(month,-12,getdate())),120) as dtsearch from master..spt_values where type='P' and dateadd(mm,number,dateadd(month,-12,getdate()))<=getdate();
    -- 定义错误返回信息
  declare @error int 
    -- 定义接收参数
  declare @TeamName varchar(50)
  declare @Teamid varchar(50)
  declare @OrderNo varchar(50)
  -- Step 1: 创建临时表
    CREATE TABLE #TempTable
    (
        teamid int,
        teamname VARCHAR(50),
        monthshow VARCHAR(50),
        amountall decimal(18,2),
    )
  set @error=0
  --定义游标
  declare demo_cursor cursor
  for select distinct TeamName,teamid,OrderNo from table1(部门) where ParentID=0 and teamid<>60 and isdel=0 order by OrderNo 
  
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
  --打开游标--
  open demo_cursor
  --开始循环游标变量--
  fetch next from demo_cursor into @TeamName,@Teamid,@OrderNo
  while @@FETCH_STATUS = 0  --返回被 FETCH语句执行的最后游标的状态--
  BEGIN
     --声明第二个游标
     declare d_cursor CURSOR
       for select convert(varchar(7),dateadd(mm,number,dateadd(month,-12,getdate())),120) as dtsearch from master..spt_values where type='P' and dateadd(mm,number,dateadd(month,-12,getdate()))<=getdate()
     --打开第二个游标
     OPEN d_cursor
     declare @dtsearch nvarchar(50)
       fetch next from d_cursor into @dtsearch
     --第二个由标的循环体
     WHILE @@FETCH_STATUS =0
     BEGIN
     
       ----------------
       --需要的逻辑语句--
       ----------------
      --print @TeamName+'____'+@Teamid
      --Select @TeamName as teamname,CONVERT(varchar(7),CreateTime, 120)  as monthShow,round(SUM(Amount),0) as amountall FROM table2(业绩表) where TeamId=@Teamid and CONVERT(varchar(7),CreateTime, 120)=@dtsearch Group by CONVERT(varchar(7),CreateTime, 120) order by CONVERT(varchar(7),CreateTime, 120) desc
       -- Step 2: 向临时表中插入数据
    INSERT INTO #TempTable (teamid, teamname,monthshow,amountall)
    Select @Teamid as teamid,@TeamName as teamname,CONVERT(varchar(7),CreateTime, 120)  as monthshow,round(SUM(Amount),0,1) as amountall FROM table2(业绩表)  where TeamId=@Teamid and CONVERT(varchar(7),CreateTime, 120)=@dtsearch Group by CONVERT(varchar(7),CreateTime, 120);
      set @error= @error + @@ERROR  --记录每次运行sql后是否正确,0正确
       --**--用于第二个循环体循环,缺少将成为死循环**
        fetch next from d_cursor into @dtsearch
     END
   --关闭第二个游标
   CLOSE d_cursor
   --释放第二个游标的资源
   DEALLOCATE d_cursor
   
      fetch next from demo_cursor into @TeamName,@Teamid,@OrderNo  --转到下一个游标,没有会死循环
   end
  close demo_cursor --关闭游标
  deallocate demo_cursor  --释放游标
  -- Step 3: 对临时表进行查询和操作
    SELECT * FROM #TempTable;
     -- Step 4: 销毁临时表
    DROP TABLE #TempTable;
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,存储过程可以使用游标来处理数据。游标是一种用于遍历和操作结果集的数据库对象。SQL Server支持三种游标实现方式:基于DECLARE CURSOR语法、基于OLE DB和ODBC中的API游标函数以及基于API服务器游标。\[2\] 使用游标可以在存储过程中逐行处理结果集,对每一行进行特定的操作。例如,可以使用游标在结果集中循环遍历每一行,并根据特定条件进行数据操作。游标可以在存储过程中声明和使用,通过FETCH语句可以获取结果集中的每一行数据。 以下是一个使用游标的示例代码: ``` CREATE PROCEDURE ProcessData AS BEGIN DECLARE @Name VARCHAR(50) DECLARE @Age INT -- 声明游标 DECLARE CursorName CURSOR FOR SELECT Name, Age FROM YourTable -- 打开游标 OPEN CursorName -- 获取第一行数据 FETCH NEXT FROM CursorName INTO @Name, @Age -- 循环处理结果集 WHILE @@FETCH_STATUS = 0 BEGIN -- 在这里可以对每一行数据进行操作 -- 例如,可以根据条件更新数据或者进行其他逻辑处理 -- 获取下一行数据 FETCH NEXT FROM CursorName INTO @Name, @Age END -- 关闭游标 CLOSE CursorName DEALLOCATE CursorName END ``` 在上述示例中,我们声明了一个名为CursorName的游标,并使用FETCH语句获取每一行数据。然后,我们可以在循环中对每一行数据进行操作。最后,我们关闭并释放游标。请注意,在实际使用中,应根据具体需求进行适当的修改和优化。\[1\] #### 引用[.reference_title] - *1* *2* *3* [Sql Server 存储过程游标](https://blog.csdn.net/qq_29342297/article/details/109181443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值