Von hier :
Die folgenden Anforderungen müssen erfüllt sein, damit eine Nearest Neighbor-Abfrage einen räumlichen Index verwenden kann:
- Ein räumlicher Index muss für eine der räumlichen Spalten vorhanden sein, und die STDistance()-Methode muss diese Spalte in den WHERE- und ORDERBY-Klauseln verwenden.
- Die TOP-Klausel darf keine PERCENT-Anweisung enthalten.
- Die WHERE-Klausel muss eine STDistance()-Methode enthalten.
- Wenn mehrere Prädikate in der WHERE-Klausel vorhanden sind, muss das Prädikat, das die STDistance()-Methode enthält, durch eine UND-Verknüpfung mit den anderen Prädikaten verbunden werden. Die Methode STDistance() darf nicht in einem optionalen Teil der WHERE-Klausel stehen.
- Der erste Ausdruck in der ORDER BY-Klausel muss die STDistance()-Methode verwenden.
- Sortierreihenfolge für den ersten STDistance()-Ausdruck in der ORDER BY-Klausel muss ASC sein.
- Alle Zeilen, für die STDistance NULL zurückgibt, müssen herausgefiltert werden.
Das sollte also funktionieren:
DECLARE @g geography;
declare @point nvarchar(50) =''
declare @i int =0,
@lat decimal(8,6) =0.0,
@long decimal(8,6) =0.0,
@start datetime = getdate()
set @lat =(select (0.9 -Rand()*1.8)*100)
set @long =(select (0.9 -Rand()*1.8)*100)
set @point = (select 'POINT('+CONVERT(varchar(10), @lat)+ ' '
+CONVERT(varchar(10), @long)+')')
SET @g = geography::STGeomFromText(@point, 4326);
SELECT TOP 1000
@lat,
@long,
@g.STDistance(st.[coord]) AS [DistanceFromPoint (in meters)]
, st.[coord]
, st.id
FROM Temp st with(index([SpatialIndex_1]))
WHERE @g.STDistance(st.[coord]) IS NOT NULL
ORDER BY @g.STDistance(st.[coord]) asc
Sie können überprüfen, ob es den räumlichen Index verwendet, sogar den WITH INDEX
Hinweis wurde entfernt.