Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Förhandsversion av Microsoft Fabric
En vanlig fråga som används med rumsliga data är den närmaste grannfrågan. Närmsta grannfrågor används för att hitta närmaste rumsliga objekt till ett specifikt rumsligt objekt. Till exempel måste en butikslokaliserare för en webbplats ofta hitta de närmaste butiksplatserna till en kundplats.
En närmaste grannfråga kan skrivas i olika giltiga frågeformat, men för att närmaste grannfråga ska kunna använda ett rumsligt index måste följande syntax användas.
Syntax
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
Närmaste grannfråga och rumsliga index
I SQL Server används TOP- och ORDER BY-satser för att utföra en närmaste grannfråga på spatiala datakolumner. Satsen ORDER BY innehåller ett anrop till metoden STDistance() för datatypen spatial kolumn. Satsen TOP anger antalet objekt som ska returneras för frågan.
Följande krav måste uppfyllas för att en närmaste grannfråga ska kunna använda ett rumsligt index:
Ett rumsligt index måste finnas på en av de rumsliga kolumnerna och metoden
STDistance()måste använda kolumnen i satsernaWHEREochORDER BY.Satsen
TOPfår inte innehålla enPERCENT-instruktion.Satsen
WHEREmåste innehålla enSTDistance()-metod.Om det finns flera predikat i
WHERE-satsen måste predikatet som innehållerSTDistance()-metoden anslutas med enANDkonjunktion till de andra predikaten. MetodenSTDistance()kan inte finnas i en valfri del avWHERE-satsen.Det första uttrycket i
ORDER BY-satsen måste använda metodenSTDistance().Sorteringsordningen för det första
STDistance()uttrycket iORDER BY-satsen måste varaASC.Alla rader som
STDistancereturnerarNULLmåste filtreras bort.
Warning
Metoder som tar geografi eller geometri datatyper som argument returnerar NULL om SRID:erna inte är samma för typerna.
Vi rekommenderar att de nya spatiala indexindelningarna används för index som används i närmaste grannsökningar. Mer information om spatial index-tessellationer finns i Spatial Data.
Example 1
I följande kodexempel visas en närmaste grannfråga som kan använda ett rumsligt index. I exemplet används tabellen Person.Address i AdventureWorks2022 exempeldatabas.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
Skapa ett rumsligt index i kolumnen SpatialLocation för att se hur en närmaste grannfråga använder ett rumsligt index. Mer information om hur du skapar rumsliga index finns i Skapa, ändra och släppa rumsliga index.
Example 2
I följande kodexempel visas en närmaste grannfråga som inte kan använda ett rumsligt index.
USE AdventureWorks2022
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
Frågan saknar en WHERE-sats som använder STDistance() i ett formulär som anges i syntaxavsnittet så att frågan inte kan använda ett rumsligt index.