Từ tại đây :
Các yêu cầu sau phải được đáp ứng để truy vấn Nearest Neighbor sử dụng chỉ mục không gian:
- Chỉ mục không gian phải có trên một trong các cột không gian và phương thức STDistance () phải sử dụng cột đó trong mệnh đề WHERE và ORDERBY.
- Mệnh đề TOP không được chứa câu lệnh PERCENT.
- Mệnh đề WHERE phải chứa phương thức STDistance ().
- Nếu có nhiều vị từ trong mệnh đề WHERE thì thepredicate chứa phương thức STDistance () phải được kết nối bằng một liên kết AND với các vị từ khác. Phương thức STDistance () không thể nằm trong một phần tùy chọn của mệnh đề WHERE.
- Biểu thức đầu tiên trong mệnh đề ORDER BY phải sử dụng phương thứcSTDistance ().
- Thứ tự sắp xếp cho biểu thức STDistance () đầu tiên trong Điều khoản ĐẶT HÀNG phải là ASC.
- Tất cả các hàng mà STDistance trả về NULL phải được lọc ra.
Vì vậy, điều này sẽ hoạt động:
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
Bạn có thể kiểm tra xem nó có đang sử dụng chỉ mục khoảng cách ngay cả WITH INDEX
không gợi ý bị xóa.