Sie können Ihre Objekte in einem GEOGRAPHY speichern Spalte und erstellen Sie einen SPATIAL INDEX über dieser Spalte.
Leider SQL Server implementiert räumliche Indizes durch Kacheln der Oberfläche und Speichern der Kachelkennungen in einem einfachen B-Tree Index, also einfach ORDER BY STDistance wird nicht funktionieren (na ja, es wird funktionieren, aber den Index nicht verwenden).
Stattdessen müssen Sie eine Abfrage ähnlich der folgenden durchführen:
DECLARE @mypoint GEOGRAPHY
SET @mypoint = geography::STGeomFromText('POINT(@mylat, @mylon)', 4326);
WITH num (distance) AS
(
SELECT 1000
UNION ALL
SELECT distance + 1000
FROM num
WHERE distance <= 50000
)
SELECT TOP 1 m.*
FROM num
CROSS APPLY
(
SELECT TOP 1 *
FROM mytable
WHERE myroad.STDistance(@mypoint) <= distance
ORDER BY
STDistance(@mypoint)
) m
Auf diese Weise SQL Server sucht zuerst nach Straßen innerhalb von 1 Kilometer von Ihrem Punkt entfernt, dann innerhalb von 2 Kilometer usw., jedes Mal mit dem Index.
Aktualisierung:
Wenn Sie mehrere Punkte in einer Tabelle haben und den nächstgelegenen Punkt für jeden von ihnen finden möchten:
WITH num (distance) AS
(
SELECT 1000
UNION ALL
SELECT distance + 1000
FROM num
WHERE distance <= 50000
)
SELECT mp.mypoint, m.*
FROM @mypoints mp
CROSS APPLY
(
SELECT TOP 1 m.*
FROM num
CROSS APPLY
(
SELECT TOP 1 *
FROM mytable
WHERE myroad.STDistance(@mypoint) <= distance
ORDER BY
STDistance(@mypoint)
) m
) m