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.
Eine allgemeine Abfrage, die mit räumlichen Daten verwendet wird, ist die Nearest Neighbor-Abfrage. Nächste Nachbarabfragen werden verwendet, um die nächstgelegenen räumlichen Objekte zu einem bestimmten räumlichen Objekt zu finden. Ein Filialsucher für eine Webseite muss beispielsweise häufig die nächstgelegenen Geschäftsstandorte für einen Kundenstandort finden.
Eine Nächste Nachbarn-Abfrage kann in einer Vielzahl gültiger Abfrageformate geschrieben werden, aber für die Nächste Nachbarabfrage muss die folgende Syntax verwendet 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 Indexe
Auf SQL Server werden die Klauseln TOP und ORDER BY verwendet, um eine Nearest Neighbor-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 Anzahl der Objekte an, die für die Abfrage zurückgegeben werden sollen.
Die folgenden Anforderungen müssen erfüllt sein, damit eine Nächste Nachbarabfrage einen räumlichen Index verwendet:
Ein räumlicher Index muss in einer der räumlichen Spalten vorhanden sein, und die
STDistance()-Methode muss dieselbe Spalte in denWHEREundORDER BY-Klauseln verwenden.Die
TOP-Klausel darf keinePERCENT-Anweisung enthalten.Die
WHEREKlausel muss eineSTDistance()Methode enthalten.Wenn mehrere Prädikate in der
WHEREKlausel vorhanden sind, muss das Prädikat, das die Methode enthältSTDistance(), durch eineANDKonjunktion mit den anderen Prädikaten verbunden werden. DieSTDistance()Methode kann nicht in einem optionalen Teil derWHEREKlausel enthalten sein.Der erste Ausdruck in der
ORDER BYKlausel muss dieSTDistance()Methode verwenden.Die Sortierreihenfolge für den ersten
STDistance()Ausdruck in derORDER BYKlausel muss seinASC.Alle Zeilen, für die
STDistanceden WertNULLzurückgibt, müssen herausgefiltert werden.
Warnung
Methoden, die die Datentypen geography oder geometry als Argumente nehmen, geben NULL zurück, wenn die SRIDs für die Typen nicht identisch sind.
Es wird empfohlen, dass die neuen räumlichen Index-Tessellationen für Indizes verwendet werden, die in Nearest Neighbor-Abfragen verwendet werden. Weitere Informationen zu räumlichen Index-Tessellationen finden Sie unter Spatial Data (SQL Server).For more information on spatial index tessellations, see Spatial Data (SQL Server).
Beispiel
Das folgende Codebeispiel zeigt eine Nearest Neighbor-Abfrage, die einen räumlichen Index verwenden kann. Im Beispiel wird die Person.Address Tabelle in der AdventureWorks2012 Datenbank verwendet.
USE AdventureWorks2012
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 für die Spalte SpatialLocation, um zu sehen, wie eine Nächste Nachbarabfrage einen räumlichen Index verwendet. Weitere Informationen zum Erstellen räumlicher Indizes finden Sie unter Create, Modify und Drop Spatial Indexes.
Beispiel
Das folgende Codebeispiel zeigt eine Nearest Neighbor-Abfrage, die keinen räumlichen Index verwenden kann.
USE AdventureWorks2012
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
Die Abfrage fehlt eine WHERE Klausel, die STDistance() in einer im Syntaxabschnitt angegebenen Form verwendet, daher kann die Abfrage keinen räumlichen Index verwenden.