Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric Preview
Een veelvoorkomende query die wordt gebruikt met ruimtelijke gegevens, is de dichtstbijzijnde buurquery. Query's van dichtstbijzijnde buren worden gebruikt om de dichtstbijzijnde ruimtelijke objecten te vinden voor een specifiek ruimtelijk object. Een winkelzoeker voor een website moet bijvoorbeeld vaak de dichtstbijzijnde winkellocaties vinden bij een klantlocatie.
Een nabijheidsquery kan worden geschreven in verschillende geldige queryindelingen, maar moet de volgende syntaxis gebruiken om een ruimtelijke index te benutten.
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 ]
[ ; ]
Nabijheidsquery en ruimtelijke indices
In SQL Server worden TOP- en ORDER BY-componenten gebruikt om een dichtstbijzijnde buurquery uit te voeren op kolommen met ruimtelijke gegevens. De ORDER BY-clausule bevat een aanroep van de STDistance()-methode voor het ruimtelijk kolomgegevenstype. De component TOP geeft het aantal objecten aan dat moet worden geretourneerd voor de query.
Aan de volgende vereisten moet worden voldaan voor een dichtstbijzijnde buurquery voor het gebruik van een ruimtelijke index:
Een ruimtelijke index moet aanwezig zijn op een van de ruimtelijke kolommen en de methode
STDistance()moet die kolom gebruiken in deWHERE- enORDER BY-clausules.De
TOP-clausule kan geenPERCENT-verklaring bevatten.De
WHERE-clausule moet eenSTDistance()-methode bevatten.Als er meerdere predicaten in de
WHEREcomponent staan, moet het predicaat metSTDistance()methode worden verbonden door eenANDsamenvoeging met de andere predicaten. De methodeSTDistance()kan niet in een optioneel deel van deWHERE-component staan.De eerste expressie in de
ORDER BY-component moet de methodeSTDistance()gebruiken.Sorteervolgorde voor de eerste
STDistance()-uitdrukking in deORDER BY-clausule moetASCzijn.Alle rijen waarvoor
STDistanceNULLretourneert, moeten worden uitgefilterd.
Warning
Methoden die geografie of geometrie gegevenstypen als argumenten, retourneren NULL als de SRID's niet hetzelfde zijn voor de typen.
Het wordt aanbevolen om de nieuwe ruimtelijke indextegels te gebruiken voor indexen die worden gebruikt in nabijheidsqueries. Zie ruimtelijke datavoor meer informatie over ruimtelijke indextessellaties.
Example 1
In het volgende codevoorbeeld ziet u een dichtstbijzijnde buurquery die een ruimtelijke index kan gebruiken. In het voorbeeld wordt de Person.Address tabel in de AdventureWorks2022 voorbeelddatabase gebruikt.
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);
Maak een ruimtelijke index in de kolom SpatialLocation om te zien hoe een dichtstbijzijnde buurquery gebruikmaakt van een ruimtelijke index. Zie Ruimtelijke indexen maken, wijzigen en verwijderenvoor meer informatie over het maken van ruimtelijke indexen.
Example 2
In het volgende codevoorbeeld ziet u een dichtstbijzijnde buurquery die geen ruimtelijke index kan gebruiken.
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);
De query ontbreekt een WHERE component die gebruikmaakt van STDistance() in een formulier dat is opgegeven in de syntaxissectie, zodat de query geen ruimtelijke index kan gebruiken.