आप अपनी वस्तुओं को GEOGRAPHY
. में स्टोर कर सकते हैं कॉलम बनाएं और एक SPATIAL INDEX
बनाएं इस कॉलम के ऊपर।
दुर्भाग्य से, SQL Server
सतह पर टाइल लगाकर और एक सादे B-Tree
में टाइल पहचानकर्ताओं को संग्रहीत करके स्थानिक अनुक्रमणिका लागू करता है सूचकांक, इतना सादा ORDER BY STDistance
काम नहीं करेगा (ठीक है, यह काम करेगा लेकिन सूचकांक का उपयोग नहीं करेगा)।
इसके बजाय, आपको इससे मिलती-जुलती एक क्वेरी बनानी होगी:
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
इस तरह, SQL Server
सबसे पहले 1
. के अंदर सड़कों की खोज करेगा अपने स्थान से किलोमीटर, फिर 2
. के भीतर किलोमीटर, आदि, हर बार सूचकांक का उपयोग करते हुए।
अपडेट करें:
यदि आपके पास एक तालिका में कई बिंदु हैं और आप उनमें से प्रत्येक के लिए निकटतम बिंदु खोजना चाहते हैं:
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