Я бы определенно попытался сделать это на сервере - старайтесь не перетаскивать 400 000 строк, чтобы просто вычислить одно число (в конце).
Также: я бы попробовал сделать это без курсора , если это возможно. Курсоры являются кошмаром на SQL Server - их следует избегать любой ценой.
В вашем случае - не зная вашей детальной структуры таблицы - вы можете определенно сделать, например, рекурсивное CTE (Common Table Expression), которое начинается с первого элемента и общего расстояния 0,0, а затем рекурсивно суммирует все другие промежуточные точки, вычисляя расстояние между точкой (x + 1) и точкой x и суммируя предыдущий итог.
В конце у вас должен быть CTE, который показывает все промежуточные точки, все расстояния между любыми двумя путевыми точками и общее расстояние всего путешествия.
Этот CTE будет выглядеть примерно так:
;WITH Waypoints AS
(
-- anchor your query
SELECT
WaypointID, PrevWaypointID, Long, Lat, 0.0 as Distance, 0.0 as SumOfDistance
FROM
dbo.Waypoint
WHERE
PrevWaypointID IS NULL -- or some other condition
UNION -- recurse
SELECT
WaypointID, Long, Lat,
dbo.GetDistanceBetween(wp.WaypointID, pts.WaypointID), -- distance
pts.SumOfDistance + dbo.GetDistanceBetween(wp.WaypointID, pts.WaypointID) -- sum
FROM
dbo.Waypoint wp
INNER JOIN
Waypoints pts ON wp.PrevWaypointID = pts.WaypointID
WHERE
(some condition; ID = 1 or PreviousWaypointID IS NULL or something)
)
SELECT * FROM Waypoints