Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Ponto de extremidade de análise de SQL no Microsoft Fabric
Warehouse no Microsoft Fabric
Banco de dados SQL no Microsoft Fabric
Uma consulta comum usada com dados espaciais é a consulta do vizinho mais próximo. As consultas de vizinhos mais próximos são usadas para localizar os objetos espaciais mais próximos de um objeto espacial específico. Por exemplo, um localizador de lojas para um site geralmente deve encontrar as lojas mais próximas da localização do cliente.
Uma consulta do vizinho mais próximo pode ser escrita em vários formatos de consulta válidos, mas para que a consulta do vizinho mais próximo use um índice espacial, a sintaxe a seguir deve ser usada.
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 ]
[ ; ]
Consulta de vizinho mais próximo e índices espaciais
No SQL Server, as cláusulas TOP e ORDER BY são usadas para realizar uma consulta de vizinho mais próximo em colunas de dados espaciais. A cláusula ORDER BY contém uma chamada ao método STDistance() para o tipo de dados de coluna espacial. A cláusula TOP indica o número de objetos a ser retornado para a consulta.
Os seguintes requisitos devem ser atendidos para que uma consulta do vizinho mais próximo use um índice espacial:
Um índice espacial deve estar presente em uma das colunas espaciais e o método
STDistance()deve usar essa coluna nas cláusulasWHEREeORDER BY.A cláusula
TOPnão pode conter uma instruçãoPERCENT.A cláusula
WHEREdeve conter um métodoSTDistance().Se houver vários predicados na cláusula
WHERE, o predicado que contém o métodoSTDistance()deve ser conectado por uma conjunçãoANDaos outros predicados. O métodoSTDistance()não pode estar em uma parte opcional da cláusulaWHERE.A primeira expressão da cláusula
ORDER BYdeve usar o métodoSTDistance().A ordem de classificação para a primeira expressão
STDistance()na cláusulaORDER BYdeve serASC.Todas as linhas para as quais
STDistanceretornaNULLdevem ser excluídas.
Warning
Os métodos que aceitam tipos de dados geography ou geometry como argumentos retornarão NULL se os SRIDs não forem os mesmos para os tipos.
Recomenda-se que as novas tesselações de índice espacial sejam usadas para índices usados em consultas de vizinhos mais próximos. Para obter mais informações sobre tesselações de índice espacial, consulte Dados Espaciais.
Exemplo 1
O exemplo de código a seguir mostra uma consulta de vizinho mais próximo que pode usar um índice espacial. O exemplo usa a tabela Person.Address no banco de dados de amostra AdventureWorks2025.
Note
No Banco de Dados SQL do Azure e no SQL Database no Microsoft Fabric, a instrução USE não está disponível. Em vez disso, conecte-se diretamente ao banco de dados pretendido e execute o restante do exemplo de código.
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);
Crie um índice espacial na coluna SpatialLocation para ver como uma consulta de vizinho mais próximo usa um índice espacial. Para obter mais informações sobre como criar índices espaciais, consulte Criar, Modificar e Excluir Índices Espaciais.
Exemplo 2
O exemplo de código a seguir mostra uma consulta de vizinho mais próximo que não pode usar um índice espacial.
Note
No Banco de Dados SQL do Azure e no SQL Database no Microsoft Fabric, a instrução USE não está disponível. Em vez disso, conecte-se diretamente ao banco de dados pretendido e execute o restante do exemplo de código.
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);
A consulta não tem uma cláusula WHERE que usa STDistance() em uma forma especificada na seção de sintaxe; portanto, a consulta não pode usar um índice espacial.