共用方式為


查詢最接近像素的空間資料

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體

最接近像素查詢是搭配空間資料使用的常見查詢。 最接近像素查詢是用來尋找最接近特定空間物件的空間物件。 例如,網站的商店定位器通常必須尋找最接近客戶位置的商店位置。

您可以用各種有效的查詢格式來撰寫最接近像素查詢,但是若要讓最接近像素查詢使用空間索引,則必須使用下列語法。

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 ]  
[ ; ]  
  

最接近像素查詢和空間索引

在 SQL Server 中,TOPORDER BY 子句是用來針對空間資料行執行最接近像素查詢。 ORDER BY 子句包含空間資料行資料類型的 STDistance() 方法呼叫。 TOP 子句會指出要針對查詢傳回的物件數目。

若要讓最接近像素查詢使用空間索引,您必須符合下列需求:

  1. 空間索引必須存在其中一個空間資料行上,而且 STDistance() 方法必須在 WHEREORDER BY 子句中使用該資料行。

  2. TOP 子句不得包含 PERCENT 陳述式。

  3. WHERE 子句必須包含 STDistance() 方法。

  4. 如果 WHERE 子句中存在多個述詞,則包含 STDistance() 方法的述詞就必須透過 AND 結合連接至其他述詞。 STDistance() 方法不得位於 WHERE 子句的選擇性部分中。

  5. ORDER BY 子句中的第一個運算式必須使用 STDistance() 方法。

  6. STDistance() ORDER BY 子句中第一個 運算式的排序次序必須是 ASC

  7. STDistance 傳回 NULL 的所有資料列都必須篩選出來。

警告

如果 geographygeometry 資料類型的 SRID 不相同,則接受這些類型作為引數的方法就會傳回 NULL

建議您針對最接近像素查詢中使用的索引使用新的空間索引鑲嵌。 如需空間索引鑲嵌的詳細資訊,請參閱空間資料 (SQL Server)

範例 1

下列程式碼範例會顯示可使用空間索引的最接近像素查詢。 此範例使用 Person.Address 範例資料庫中的 AdventureWorks2022 資料表。

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);  

您可以針對 SpatialLocation 資料行建立空間索引,以便查看最接近像素查詢如何使用空間索引。 如需建立空間索引的詳細資訊,請參閱 建立、修改及卸除空間索引

範例 2

下列程式碼範例會顯示無法使用空間索引的最接近像素查詢。

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);  

這個查詢缺少按照語法區段中指定之格式使用 WHERE STDistance() 子句,因此這個查詢無法使用空間索引。

另請參閱

空間資料 (SQL Server)