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
Warehouse in Microsoft Fabric
SQL-database in Microsoft Fabric
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.
Syntaxis
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
WHERE
component staan, moet het predicaat metSTDistance()
methode worden verbonden door eenAND
samenvoeging 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 moetASC
zijn.Alle rijen waarvoor
STDistance
NULL
retourneert, moeten worden uitgefilterd.
Waarschuwing
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.
Voorbeeld 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.
Voorbeeld 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.