Fra her :
Følgende krav skal være opfyldt, for at en Nearest Neighbor-forespørgsel kan bruge et rumligt indeks:
- Et rumligt indeks skal være til stede på en af de rumlige kolonner, og STDistance()-metoden skal bruge denne kolonne i WHERE- og ORDERBY-sætningerne.
- TOP-sætningen kan ikke indeholde en PERCENT-sætning.
- WHERE-udtrykket skal indeholde en STDistance()-metode.
- Hvis der er flere prædikater i WHERE-sætningen, skal prædikatet, der indeholder STDistance()-metoden, forbindes med en AND-konjunktion til de andre prædikater. STDistance()-metoden kan ikke være i en valgfri del af WHERE-sætningen.
- Det første udtryk i ORDER BY-udtrykket skal bruge metoden STDistance().
- Sorteringsrækkefølgen for det første STDistance()-udtryk i ORDER BY-sætningen skal være ASC.
- Alle de rækker, som STDistance returnerer NULL for, skal filtreres fra.
Så dette burde virke:
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
Du kan kontrollere, at den bruger det rumlige indeks, selv WITH INDEX
tip er fjernet.