游标的递归遍历与临时表打标记的有关问题
游标的递归遍历与临时表打标记的问题
如何把游标取出来的当前行与建立游标的结果集做比较?比如

把游标第一次取出来是第1行,把第一行与其他行做比较,如果符合我设定的条件(该条件是一个方法,传入两个点的坐标算出直线距离)。那么把第1行和符合条件的行都打上标记“1”,等第1行遍历完毕以后,再用其他标记为“1”的行去遍历其他所有没有标记为“1”的行,直到找不出这样的行以后。再把未标记的行取出来做遍历,并且标记上“2”、“3”……,直到所有的行都打上标记。
------解决方案--------------------
游标做起来估计比较麻烦,这个问题相当于一个迭代的递归,如果是2005及其以上的版本,试试with cte的用法。
------解决方案--------------------
http://msdn.microsoft.com/zh-cn/library/bb933790(v=sql.105).aspx
如何把游标取出来的当前行与建立游标的结果集做比较?比如
把游标第一次取出来是第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