WHILE ( @@FETCH_STATUS = 0 /*AND @i < 1000*/ )
BEGIN
--SET @i = @i +1
--取下一个action信息,
FETCH NEXT FROM MYCUR 
INTO @ACTIONID,@CASEID,@STARTTIME,@PRIORITY,@ACCOUNT,
@ROLENAME,@PRODUCT,@MODULEIF EXISTS( SELECT 1 FROM @TMAP WHERE CASEID = @CASEID )--老CASE新ACTION
 BEGIN
UPDATE #T SET ENDTIME = @STARTTIME
WHERE CASEID = @CASEID AND ENDTIME IS NULL
IF EXISTS( SELECT 1 FROM TS_CHANGEACTIONS WHERE TS_ID = @ACTIONID AND TS_TRANSITIONLABEL LIKE '%close%' )
BEGIN
DELETE FROM @TMAP WHERE CASEID = @CASEID
END
ELSE
BEGIN
INSERT INTO #T VALUES (@ACTIONID,@CASEID,@STARTTIME,NULL,@PRIORITY,@ACCOUNT,
@ROLENAME,@PRODUCT,@MODULE) END
 END
ELSE --新CASE,新ACTION
 BEGIN
INSERT INTO #T VALUES (@ACTIONID,@CASEID,@STARTTIME,NULL,@PRIORITY,@ACCOUNT,
@ROLENAME,@PRODUCT,@MODULE)
INSERT INTO @TMAP VALUES(@CASEID)
 ENDEND
其中红色是说那个table,#T是临时table。@TMAP是table variable(我想用它实现类似STL中的MAP功能),
TS_CHANGEACTIONS是主要的表,其中包含约600万记录,我这里贴出部分,其他就是cursor,DECLARE等,执行起来很慢看看是不是可以有些语句方面的优化?
不胜感激:)

解决方案 »

  1.   

    to AcHerat:
    我用游标是想处理取出的每条记录,那么有什么方法可以避开游标吗
      

  2.   

    我重新写了代码,但是还很慢。
    我想实现这样的问题:input,table
    output newtable
    现在我想update一些行中某个字段,比如time字段,这个time字段要依赖本表table中的其他某一个行
    所以我用cursor来做这个事情,读到某一行,检查其中依赖条件十分成立如果成立,则修改table中另一行的time字段。
    除了CURSOR还有其他办法可以实现吗,大家理解我的需求吗,我不知道是否表述的清楚。
    cursor不就是为了处理行吗谢谢
      

  3.   

    这个可以不用游标的 可以通过 IF语句判断有无依赖如果有 

    update  tb set time=xx
       
      

  4.   

    update一些行中某个字段??看错了 需要用游标