日期:2014-05-17  浏览次数:20562 次

游标的递归遍历与临时表打标记的问题
本帖最后由 Jack_Black 于 2013-01-13 15:40:21 编辑
如何把游标取出来的当前行与建立游标的结果集做比较?比如

把游标第一次取出来是第1行,把第一行与其他行做比较,如果符合我设定的条件(该条件是一个方法,传入两个点的坐标算出直线距离)。那么把第1行和符合条件的行都打上标记“1”,等第1行遍历完毕以后,再用其他标记为“1”的行去遍历其他所有没有标记为“1”的行,直到找不出这样的行以后。再把未标记的行取出来做遍历,并且标记上“2”、“3”……,直到所有的行都打上标记。
DECLARE Test_Cur CURSOR SCROLL FOR
SELECT   A.Vqm_MonPointId,A.CustName
,A.Lat2,A.Lon2,A.ErrorR  
FROM Vqm_MonPoint A left join Vqm_MonPoint B ON A.UnitSId=b.UnitSId inner join Hr_Dep D on D.Hr_DepId=A.UnitSId inner join Vqm_PointLog c on(a.Vqm_MonPointId=c.Vqm_MonPointId) where 
  A.Vqm_MonPointId<>B.Vqm_MonPointId and v2.dbo.GetDistance(A.Lat2,A.Lon2,B.Lat2,B.lon2)<(A.ErrorR+B.ErrorR) 
  and  
       (c.EndMonTime is  null or cast( c.EndMonTime as date ) >=cast(CAST(20121201 as varchar)as date ))
    and c.StartMonTime is not null 
    and cast( c.StartMonTime as date )<=CAST(20121231 as varchar )                          
     and A.UnitGName='青羊供电局'
OPEN Test_Cur
DECLARE @id NVARCHAR(60), @CustName VARCHAR(100),@Lat2 numeric(18, 9) , @Lon2 numeric(18, 9),@Error numeric(18, 9)
  FETCH NEXT FROM Test_Cur INTO @id,@CustName,@Lat2,@Lon2,@Error
WHILE @@FETCH_STATUS=0
BEGIN
PRINT @id+' '+@CustName+' ||'+CAST(@Lat2 as VARCHAR(100))
----?????
  FETCH NEXT FROM Test_Cur INTO @id,@CustName,@Lat2,@Lon2,@Error
END
CLOSE Test_Cur
DEALLOCATE Test_Cur
游标 递归 打标记 循环

------解决方案--------------------
游标做起来估计比较麻烦,这个问题相当于一个迭代的递归,如果是2005及其以上的版本,试试with cte的用法。
------解决方案--------------------
引用:
引用:这个用空间类型设计是可以轻松实现的呃没听过“空间类型设计”能详细一点么

http://msdn.microsoft.com/zh-cn/library/bb933790(v=sql.105).aspx