首页 > 其他 > 详细

有关游标的使用

时间:2016-12-08 17:53:21      阅读:204      评论:0      收藏:0      [点我收藏+]

因为项目改动,需要把一段C#代码变成存储过程,然后代码里面有一个foreach,sql里面可没foreach啊,就用游标咯。
贴代码

    DECLARE TrackingNumber_Cursor CURSOR --定义游标
    
    --查出需要的集合放到游标中
    FOR (SELECT por1.OrderNumber,por1.CheckingID,p.WmsState FROM FMS_Package p join FMS_PackageOrderRelation por1 on p.PackageID = por1.PackageID
    WHERE  EXISTS (SELECT OrderNumber FROM FMS_PackageOrderRelation por2 WHERE PackageID =@IntoPackageID and por1.OrderNumber = por2.OrderNumber))

    OPEN TrackingNumber_Cursor; --打开游标
    FETCH NEXT FROM TrackingNumber_Cursor  INTO @COID,@CheckingID,@WmsState; --读取第一行数据
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @BINT=CHARINDEX(F,@CheckingID);
            IF(@WmsState!=2 AND @BINT=1)
            BEGIN
                SET @ShipState=parting;
            END
            Update tdShipInfor SET [SendTime]=@IntoTransDate,[SINo]=@IntoTrackingNumber WHERE coid=@COID;
            Update tdCOMain set COState=@WmsState where coid=@COID;
        
            FETCH NEXT FROM TrackingNumber_Cursor ; --读取下一行数据
        END
    CLOSE TrackingNumber_Cursor; --关闭游标
    DEALLOCATE TrackingNumber_Cursor; --释放游标

呐,就是这个东东了。写完之后执行,发现巨慢,要用40秒才能执行完成。哎呀,这还了得啊,不被骂死才怪了,所以找原因咯。
找找找,终于找到了,给游标加上只读标识。

    DECLARE TrackingNumber_Cursor CURSOR --定义游标
    READ_ONLY--设置游标只读
    --查出需要的集合放到游标中
    FOR (SELECT por1.OrderNumber,por1.CheckingID,p.WmsState FROM FMS_Package p join FMS_PackageOrderRelation por1 on p.PackageID = por1.PackageID
    WHERE  EXISTS (SELECT OrderNumber FROM FMS_PackageOrderRelation por2 WHERE PackageID =@IntoPackageID and por1.OrderNumber = por2.OrderNumber))

    OPEN TrackingNumber_Cursor; --打开游标
    FETCH NEXT FROM TrackingNumber_Cursor  INTO @COID,@CheckingID,@WmsState; --读取第一行数据
    WHILE @@FETCH_STATUS = 0
        BEGIN
            SET @BINT=CHARINDEX(F,@CheckingID);
            IF(@WmsState!=2 AND @BINT=1)
            BEGIN
                SET @ShipState=parting;
            END
            Update tdShipInfor SET [SendTime]=@IntoTransDate,[SINo]=@IntoTrackingNumber WHERE coid=@COID;
            Update tdCOMain set COState=@WmsState where coid=@COID;
        
            FETCH NEXT FROM TrackingNumber_Cursor ; --读取下一行数据
        END
    CLOSE TrackingNumber_Cursor; --关闭游标
    DEALLOCATE TrackingNumber_Cursor; --释放游标

就设置了一个只读,然后执行只需0.5秒。

至于为什么,我也不知道,我猜应该是第一次的时候,更新操作在游标里面执行,导致的吧。

顺便分享一个链接。http://www.cnblogs.com/jiajiayuan/archive/2011/07/14/2106341.html

有关游标的使用

原文:http://www.cnblogs.com/fengbenwuxing/p/6145507.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!