几个存储过程(“sp1,sp2,sp3,sp4,sp5,sp6”)同时从DAList表中读取不同类型的数据,分别进行各种计算处理。   计算完成后从DAList表删除改条数据。
问题一:
        几个存储过程(“sp1,sp2,sp3,sp4,sp5,sp6”)里面都定义了游标“Cur” 从 T_DAList表中查询数据。 那么当这几个存储过程作为作业独立运行的时候,相互之间会不会相互锁定,相互等待???
问题二:
      游标和临时表各有什么优缺点???      什么时候应该使用临时表?           什么时候应该使用游标?问题三:
       这种情况使用游标是不是更合适???Select  @DADayNow = CONVERT(varchar(100), GETDATE(), 112)
--print left(@DADayNow,6) DECLARE Cur CURSOR FOR --控制只取前25000行数据做计算
SELECT TOP 500 DANo,UpdateTime,LogTime,DataType,DAType,DAYear,DAMonth,DADay,DAHour,CollegeNo,CampusNo,BuildingNo,BuildingType,SumQty,EType,EIndex,
ESubitem,ESubitem1,ESubitem2,Unit,Lable,Note FROM T_DAList 

WHERE DataType='Public'  and   DAType='h' and  ESubitem!=''  ORDER   BY   (DAYear+DAMonth+DADay+DAHour)    OPEN Cur

解决方案 »

  1.   

    一:默认的游标是 READ_ONLY的,不会加锁。
    二:其实你给游标加上 STATIC 选项,就是自动把 SELECT 的结果放在一个临时表中,游标从临时表取数。
    三:游标最主要的是一次只操作一条数据,和表没有直接的可比性。关键看需求来决定采用什么方式。
      

  2.   


    大神,几个存储过程(“sp1,sp2,sp3,sp4,sp5,sp6”)同时从DAList表中读取不同类型的数据,分别进行各种计算处理。   计算完成后从DAList表删除改条数据这种需求用临时表合适,还是用游标合适啊???   求大神指点啊。
      

  3.   

    如果你的游标只用于处理类似遍历的效果,不在每次游标指向里过多涉及其他集合的关联操作,是可以用,速度也很快但其他情况,游标是效率是慢于集合操作的,SQLSERVER会进行一定的优化,按照比较好的方式执行,而你用游标相当于限定死优化空间,效率会比较慢,一般选择游标是下策。游标确实可以不上锁,但考虑多线执行的话,我想你应该会上锁的,如果你不打算锁表,你又怎么能确保事务的统一性呢?在这种情况,我想对效率要求比较高,因此我想你处理方式,还是取决于我最开始说的,你用于处理什么样的需求。问题一,就算不上锁,操作到相同表肯定有影响问题二,我更愿意说游标操作应该拿来与集合操作比较,视需求而定问题三,看不出有什么需求你也可以到这边来多了解下游标
    http://www.cnblogs.com/knowledgesea/p/3699851.html
      

  4.   

    这和用不用游标没有关系。
    同一个DAList表的同一条记录,如果6个sp都要用到,就不能在这些sp中删除,必须是上层调用过程调用完6个sp后才能删除。既然调用6个sp的时候数据不变,直接取DAList表好了,用得着什么游标、临时表吗?
    如果这条记录,6个sp谁抢到了谁计算、删除,那么用UPDATE语句直接设个占用标记就可以了,还是用不着游标、临时表。
      

  5.   


    6个sp处理的是 T_DAList表里的不同类型的数据,比如。  一个存储过程处理年数据,一个存储过程处理月数据,一个存储过程处理日数据,一个存储过程处理时数据。
      

  6.   

    既然数据互不相关,游标或直接操作DAList都可以。临时表多复制一份数据没必要。
      

  7.   


    需求就是如上所述啊,遍历表里面的数据。  多个存储过程同时运行,数据都来自T_DAList表,但是数据是不同的。   不会出现多个存储过程处理同一条记录的情况。  这个时候用 游标效率高,还是临时表效率高啊。