Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Instanz von Azure SQL
SQL-Analyseendpunkt in Microsoft Fabric
Data Warehouse in Microsoft Fabric
SQL-Datenbank in Microsoft Fabric
Eine gängige Abfrage, die mit räumlichen Daten verwendet wird, ist die Nächste-Nachbarn-Abfrage. Nächste-Nachbarn-Abfragen werden verwendet, um die nächstgelegenen räumlichen Objekte zu einem bestimmten räumlichen Objekt zu finden. Beispielsweise muss ein Store-Locator für eine Website häufig die nächstgelegenen Filialen zum Standort eines Kunden finden.
Eine Abfrage von nächsten Nachbarn kann in einer Vielzahl von gültigen Abfrageformaten geschrieben werden. Damit jedoch für die Abfrage von nächsten Nachbarn ein räumlicher Index verwendet wird, muss die folgende Syntax angegeben werden.
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ächste Nachbarabfrage und räumliche Indizes
In SQL Server werden die Klauseln TOP und ORDER BY verwendet, um eine Nächste-Nachbarn-Abfrage für räumliche Datenspalten auszuführen. Die ORDER BY-Klausel enthält einen Aufruf der STDistance()-Methode für den Datentyp der räumlichen Spalte. Die TOP-Klausel gibt die für die Abfrage zurückzugebende Anzahl von Objekten an.
Für eine nächste Nachbarabfrage müssen die folgenden Anforderungen erfüllt sein, um einen räumlichen Index zu verwenden:
Ein räumlicher Index muss auf einer der räumlichen Spalten vorhanden sein, und die
STDistance()-Methode muss diese Spalte in derWHERE-Klausel und derORDER BY-Klausel verwenden.Die
TOP-Klausel darf keinePERCENT-Anweisung enthalten.Die
WHERE-Klausel muss eineSTDistance()-Methode enthalten.Wenn in der
WHERE-Klausel mehrere Prädikate vorhanden sind, muss das Prädikat mit derSTDistance()-Methode über eineAND-Konjunktion mit den anderen Prädikaten verbunden werden. DieSTDistance()-Methode darf sich nicht in einem optionalen Teil derWHERE-Klausel befinden.Der erste Ausdruck in der
ORDER BY-Klausel muss dieSTDistance()-Methode verwenden.Die Sortierreihenfolge für den ersten
STDistance()-Ausdruck in derORDER BY-Klausel muss aufASCfestgelegt sein.Alle Zeilen, für die
STDistanceden WertNULLzurückgibt, müssen herausgefiltert werden.
Warning
Methoden, die die Datentypen geography oder geometry als Argument annehmen, geben NULL zurück, wenn die SRIDs für die Typen nicht identisch sind.
Es wird empfohlen, dass für Indizes in Abfragen für Pixelwiederholungen die neuen Mosaiken für räumliche Indizes verwendet werden. Weitere Informationen zu räumlichen Index-Tessellationen finden Sie unter Räumliche Daten.
Beispiel 1
Das folgende Codebeispiel zeigt eine nächste Nachbarabfrage, die einen räumlichen Index verwenden kann. In diesem Beispiel wird die Person.Address-Tabelle der AdventureWorks2025 -Beispieldatenbank verwendet.
Note
In Azure SQL-Datenbank und SQL Database in Microsoft Fabric ist die Anweisung USE nicht verfügbar. Stellen Sie stattdessen eine direkte Verbindung zur gewünschten Datenbank her und führen Sie den Rest des Codebeispiels aus.
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);
Erstellen Sie einen räumlichen Index in der SpatialLocation-Spalte, um zu veranschaulichen, wie eine Abfrage von nächsten Nachbarn einen räumlichen Index verwendet. Weitere Informationen zum Erstellen von räumlichen Indizes finden Sie unter Erstellen, Ändern und Löschen von räumlichen Indizes.
Beispiel 2
Das folgende Codebeispiel zeigt eine nächste Nachbarabfrage, die keinen räumlichen Index verwenden kann.
Note
In Azure SQL-Datenbank und SQL Database in Microsoft Fabric ist die Anweisung USE nicht verfügbar. Stellen Sie stattdessen eine direkte Verbindung zur gewünschten Datenbank her und führen Sie den Rest des Codebeispiels aus.
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);
In der Abfrage fehlt eine WHERE-Klausel, die STDistance() in einem im Syntaxabschnitt angegebenen Format verwendet, sodass die Abfrage keine räumlichen Indizes verwenden kann.