CONTAINSTABLE (Transact-SQL)

針對資料行傳回含有零個、一個或多個資料列的資料表,這些資料行包含與單一文字或詞組的精確或模糊 (較不精確) 相符、單字彼此在一定距離之間的接近度,或加權相符。 CONTAINSTABLE 會用於 Transact-SQL SELECT 陳述式的 FROM 子句中,並如同正規資料表名稱一般受到參考。 它會在包含以字元為基礎之資料類型的全文檢索索引資料行上執行 SQL Server 全文檢索搜尋。

CONTAINSTABLE 與 CONTAINS 述詞一樣適用於相同的比對類型,並且使用和 CONTAINS 一樣的搜尋條件。

和 CONTAINS 不同的是,使用 CONTAINSTABLE 的查詢會傳回每個資料列的相關次序值 (RANK) 和全文檢索索引鍵 (KEY)。

[!附註]

如需有關 SQL Server 所支援的全文檢索搜尋形式的資訊,請參閱<使用全文檢索搜尋進行查詢>。

主題連結圖示 Transact-SQL 語法慣例

語法

CONTAINSTABLE ( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> ' 
     [ , LANGUAGE language_term] 
  [ , top_n_by_rank ] 
          ) 

<contains_search_condition> ::= 
    { <simple_term> 
    | <prefix_term> 
    | <generation_term> 
    | <generic_proximity_term> 
    | <custom_proximity_term> 
    |  <weighted_term> 
    } 
    | { ( <contains_search_condition> ) 
    { { AND | & } | { AND NOT | &! } | { OR | | } } 
     <contains_search_condition> [ ...n ] 
    }

<simple_term> ::= 
     { word | "phrase" }
<prefix term> ::= 
     { "word*" | "phrase*" } 
<generation_term> ::= 
     FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] ) 

<generic_proximity_term> ::= 
     { <simple_term> | <prefix_term> } { { { NEAR | ~ } 
     { <simple_term> | <prefix_term> } } [ ...n ] }

<custom_proximity_term> ::= 
  NEAR ( 
     {
        { <simple_term> | <prefix_term> } [ ,…n ]
     |
        ( { <simple_term> | <prefix_term> } [ ,…n ] ) 
      [, <maximum_distance> [, <match_order> ] ]
     }
       ) 

      <maximum_distance> ::= { integer | MAX }
      <match_order> ::= { TRUE | FALSE } 

<weighted_term> ::= 
     ISABOUT
    ( { { 
  <simple_term> 
  | <prefix_term> 
  | <generation_term> 
  | <proximity_term> 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
    )

引數

  • table
    這是已經過全文檢索索引處理的資料表名稱。 table 可以是一部分、兩部分、三部分或四部分資料庫物件名稱。 當查詢檢視時,只能包含一個全文檢索索引基底資料表。

    table 不能指定伺服器名稱,也不能用在連結伺服器的查詢中。

  • column_name
    這是為了全文檢索搜尋而進行索引處理的一個或多個資料行名稱。 資料行的類型可以是 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max)。

  • column_list
    指出您可以指定多個資料行,各資料行用逗號分隔。 column_list 必須括在括號中。 除非您指定了 language_term,否則,column_list 之所有資料行的語言都必須相同。

  • *
    指定應該使用 table 中的所有全文檢索索引資料行,以便搜尋給定的搜尋條件。 除非您指定了 language_term,否則資料表所有資料行的語言都必須相同。

  • LANGUAGE language_term
    這是在查詢中利用其資源來斷詞、確立詞幹,以及移除同義字和非搜尋字 (或停用字詞) 的語言。 這個參數是選擇性的,可以指定成對應於語言地區設定識別碼 (LCID) 的字串、整數或十六進位值。 如果指定了 language_term,就會將它代表的語言套用至搜尋條件的所有元素上。 如果未指定任何值,就會使用資料行全文檢索語言。

    如果不同語言的文件當做二進位大型物件 (BLOB) 一起儲存在單一資料行中,給定文件的地區設定識別碼 (LCID) 會判斷要建立其內容索引所使用的語言。 查詢這類資料行時,指定 LANGUAGE language_term 可以增加完全相符的機率。

    當指定為字串時,language_term 會對應到 sys.syslanguages 相容性檢視表中的 alias 資料行值。 字串必須以單引號括住,如 'language_term'。 當指定為整數時,language_term 是用於識別語言的實際 LCID。 當指定為十六進位值時,language_term 是 0x,後面接著 LCID 的十六進位值。 十六進位值不能超出 8 位數,開頭的零也包括在內。

    如果這個值是雙位元組字集 (DBCS) 格式,Microsoft SQL Server 會將它轉換成 Unicode。

    如果指定的語言無效,或尚未安裝對應於這個語言的資源,SQL Server 就會傳回錯誤。 若要使用中性語言資源,請在 language_term 中指定 0x0。

  • top_n_by_rank
    指定依遞減順序只傳回 n 個最高等級的相符項目。 它只適用於指定整數值 n 時。 如果結合 top_n_by_rank 與其他參數,則查詢所傳回的資料列數會少於實際相符所有述詞的資料列數。 top_n_by_rank 允許您只重新呼叫最相關的叫用數以提升查詢效能。

  • <contains_search_condition>
    指定 column_name 中所要搜尋的文字,以及要比對的條件。 如需有關搜尋條件的詳細資訊,請參閱<CONTAINS (Transact-SQL)>。

備註

全文檢索述詞與函數會在 FROM 述詞中隱含的單一資料表上處理。 若要在多個資料表上進行搜尋,請使用 FROM 子句中聯結的資料表,在兩個或多個資料表之產品的結果集上進行搜尋。

傳回的資料表有一個名稱為 KEY 且含有全文檢索索引鍵值的資料行。 每個全文檢索索引資料表都有一個其值確定是唯一值的資料行,且 KEY 資料行所傳回的值,是符合包含搜尋條件內指定之選擇準則之資料列的全文檢索索引鍵值。 從 OBJECTPROPERTYEX 函數中取得的 TableFulltextKeyColumn 屬性提供這個唯一索引鍵資料行的識別。 若要取得全文檢索之全文檢索索引鍵的相關資料行識別碼,請使用 sys.fulltext_indexes。 如需詳細資訊,請參閱<sys.fulltext_indexes (Transact-SQL)>。

若要取得原始資料表中您想要的資料列,請指定含有 CONTAINSTABLE 資料列的聯結。 使用 CONTAINSTABLE 的 SELECT 陳述式之 FROM 子句的一般形式如下:

SELECT select_list
FROM table AS FT_TBL INNER JOIN
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY]

CONTAINSTABLE 產生的資料表包括名稱為 RANK 的資料行。 RANK 資料行是每個資料列用於指示資料列與選擇準則相符程度的值 (0 至 1000)。 SELECT 陳述式通常利用下列其中一種方法來使用這個等級值:

  • 在 ORDER BY 子句中,傳回等級最高的資料列做為資料表中前面的資料列。

  • 在選取清單中,查看指派給每個資料列的等級值。

權限

使用者必須有資料表或所參考之資料表資料行的適當 SELECT 權限,才能取得執行權限。

範例

A.傳回等級值

下列範例會搜尋所有包含 "frame"、"wheel" 或 "tire" 等字的產品名稱,且每個字都各有不同的加權。 每個符合這些搜尋準則的傳回資料列,都會顯示相符項目的相對相似程度 (等級值)。 另外,等級最高的資料列會最先傳回。

USE AdventureWorks2012
GO

SELECT FT_TBL.Name, KEY_TBL.RANK
    FROM Production.Product AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Production.Product, Name, 
        'ISABOUT (frame WEIGHT (.8), 
        wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL
            ON FT_TBL.ProductID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC
GO

B.傳回大於指定值的等級值

下列範例會使用 NEAR 搜尋在 AdventureWorks2008 資料庫的 Production.Document 資料行中,彼此接近的 "bracket" 和 "reflector"。 只會傳回等級值大於或等於 50 的資料列。

USE AdventureWorks2012
GO

SELECT DocumentNode, Title, DocumentSummary
FROM Production.Document AS DocTable 
INNER JOIN CONTAINSTABLE(Production.Document, Document,
  'NEAR(bracket, reflector)' ) AS KEY_TBL
  ON DocTable.DocumentNode = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 50
ORDER BY KEY_TBL.RANK DESC
GO

[!附註]

如果全文檢索查詢並沒有指定做為最大距離的整數,文件若僅包含間距大於 100 個邏輯詞彙的叫用數,就不會符合 NEAR 需求,而其等級將會是 0。

C.利用 top_n_by_rank 傳回前 5 個等級的結果

下列範例會傳回 Description 資料行在 "light" 或 "lightweight" 字附近包含 "aluminum" 一字之前 5 項產品的描述。

USE AdventureWorks2012
GO

SELECT FT_TBL.ProductDescriptionID,
   FT_TBL.Description, 
   KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
   CONTAINSTABLE (Production.ProductDescription,
      Description, 
      '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)',
      5
   ) AS KEY_TBL
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
GO

GO

D.指定 LANGUAGE 引數

下列範例顯示如何使用 LANGUAGE 引數。

USE AdventureWorks2012
GO

SELECT FT_TBL.ProductDescriptionID,
   FT_TBL.Description, 
   KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL INNER JOIN
   CONTAINSTABLE (Production.ProductDescription,
      Description, 
      '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)',
      LANGUAGE N'English',
      5
   ) AS KEY_TBL
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
GO

[!附註]

使用 top_n_by_rank. 時,並不需要使用 LANGUAGE language_term argument。

請參閱

工作

建立全文檢索搜尋查詢 (Visual Database Tools)

參考

CONTAINS (Transact-SQL)

SELECT (Transact-SQL)

FROM (Transact-SQL)

概念

限制 RANK 的搜索結果

使用全文檢索搜尋進行查詢

使用全文檢索搜尋進行查詢