SQLserver使用临时表代替游标遍历

使用游标做遍历操作

DECLARE @AssessThemeID INT
DECLARE @EntityID INT

DECLARE MyCursor CURSOR  --定义游标
FOR
    SELECT ContactID,AssessThemes.ID AS AssessThemeID
    FROM AssessWorkLoadAudit LEFT JOIN AssessThemes 
    ON AssessWorkLoadAudit.AssessThemeID=AssessThemes.ID 
    WHERE AssessThemes.ID IN 
    (
    SELECT ID FROM AssessThemes WHERE YearNum=2016 OR YearNum=2015
    )
OPEN MyCursor  --打开游标
FETCH FROM MyCursor INTO @EntityID,@AssessThemeID  --取游标第一行,将字段值赋予@EntityID和@AssessThemeID
WHILE(@@FETCH_STATUS=0)
BEGIN
    IF(@EntityID IS NOT NULL AND @AssessThemeID IS NOT NULL)
    BEGIN
        --执行带参的存储过程 AnnualSummaryUpdateAssessTabletest
        EXEC AnnualSummaryUpdateAssessTabletest @EntityID,@AssessThemeID
    END
    FETCH FROM MyCursor INTO @EntityID,@AssessThemeID  --取游标的下一行并将字段值赋予@EntityID和@AssessThemeID
END
CLOSE MyCursor  --关闭游标
DEALLOCATE MyCursor   --释放游标

使用临时表做遍历操作

临时表:临时表的名称以“#”开头,临时表储存在tempdb这个系统数据库当中
临时表如何实现遍历操作?

在根据查询结果创建临时表时,在临时表中加入一列标识列,标识列数据类型为整形,且取值为一个“从1开始以1递增”的序列。形如“1、2、3、4、5、·······”,这个序列可以唯一标识每一行,通过循环定位到某一行,对行进行相应的操作。
标识列:IDENTITY(INT) AS NewID
脚本如下:

--创建临时表#AWLA
SELECT IDENTITY(INT) AS NewID,* INTO #AWLA 
FROM (SELECT ContactID,AssessThemes.ID AS AssessThemeID
    FROM AssessWorkLoadAudit LEFT JOIN AssessThemes 
    ON AssessWorkLoadAudit.AssessThemeID=AssessThemes.ID 
    WHERE AssessThemes.ID IN (SELECT ID FROM AssessThemes WHERE YearNum=2016 OR YearNum=2015)
    ) AS A

DECLARE @EntityID INT
DECLARE @AssessThemeID INT
DECLARE @NewID INT
DECLARE @RowCount INT 
SELECT @NewID=1,@RowCount=MAX(NewID) FROM #AWLA 
WHILE @NewID<=@RowCount
BEGIN
    SELECT @EntityID=ContactID,@AssessThemeID=AssessThemeID FROM #AWLA WHERE NewID=@NewID
    EXEC AnnualSummaryUpdateAssessTabletest @EntityID,@AssessThemeID
    SET @NewID=@NewID+1
END
--删除临时表
DROP TABLE #AWLA
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值