共用方式為


CONTAINSTABLE (Transact-SQL)

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

針對包含精確或模糊(較不精確)的數據行,傳回零、一或多個數據列的數據表,與單一單字和片語的相符專案、彼此距離內單字的鄰近性,或加權相符專案。 CONTAINSTABLE用於 Transact-SQL 語句的 SELECT中,並像一般表格名稱一樣被引用。 它會對包含字元型數據類型的全文檢索索引數據行執行 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 可以是一、二、三部分或四部分資料庫物件名稱。 當您查詢檢視時,只能涉及一個全文檢索索引基底表。

表格 無法指定伺服器名稱,也無法用於針對連結伺服器的查詢。

column_name

一或多個為全文檢索搜尋編製索引的資料行名稱。 資料行可為以下類型:charvarcharncharnvarchartextntextimagexmlvarbinaryvarbinary(max)

column_list

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

*

指定數據表中的所有全文檢索索引數據行都應該用來搜尋指定的搜尋條件。 除非已指定 language_term,否則資料表之所有資料行的語言都必須相同。

語言 language_term

其資源用於斷詞、詞幹和同義字庫以及雜訊單字 (或 停用詞) 移除的語言,作為查詢的一部分。 這個參數是選擇性的,可以指定成對應於語言地區設定識別碼 (LCID) 的字串、整數或十六進位值。 如果指定 language_term ,則它所代表的語言會套用至搜尋條件的所有元素。 如果未指定任何值,就會使用資料行全文檢索語言。

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

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

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

如果指定的語言無效,或未安裝對應至該語言的資源,SQL Server 會傳回錯誤。 若要使用中性語言資源,請將 0x0 指定為 language_term

top_n_by_rank

指定只會 傳回 n 個排名最高的相符專案,以遞減順序傳回。 只有在指定整數值 n 時才會套用。 如果結合 top_n_by_rank 與其他參數,則查詢所傳回的資料列數目會少於實際符合所有述詞的資料列數目。 top_n_by_rank可讓您只叫用最相關的點擊來提升查詢效能。

<contains_search_condition>

指定要在 column_name 中搜尋的文字,以及要比對的條件。 如需搜尋條件的相關資訊,請參閱 CONTAINS

備註

全文述詞和函數在單一表格上運作,該表隱含在述詞中 FROM 。 若要搜尋多個資料表,請在子句中使用 FROM 聯結的資料表來搜尋兩個或多個資料表乘積的結果集。

傳回的資料表具有名為包含 KEY 全文檢索索引鍵值的資料行。 每個全文檢索索引表格都有一個資料行,其值保證是唯一的,而該 KEY 資料行中傳回的值是符合包含搜尋條件中指定的選取準則的資料列的全文檢索索引鍵值。 TableFulltextKeyColumn從函式取得OBJECTPROPERTYEX的屬性會提供此唯一索引鍵資料行的身分識別。 若要取得與全文檢索索引的全文檢索索引鍵相關聯的資料行 ID,請使用 sys.fulltext_indexes 如需詳細資訊,請參閱 sys.fulltext_indexes

若要從原始表格取得您想要的資料列,請指定與資料列的 CONTAINSTABLE 聯結。 陳述FROM式的SELECT子句的CONTAINSTABLE典型形式是:

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。 基本範例

下列範例會建立並填入包含兩欄的簡單資料表,列出三個國家/地區及其旗標中的色彩。 它會在表格上建立並填入全文檢索目錄和索引。 然後 CONTAINSTABLE 演示語法。 此範例示範當符合搜尋值多次時,排名值如何成長得更高。 在最後一個查詢中,同時包含綠色和黑色的坦尚尼亞的排名高於僅包含查詢顏色之一的義大利。

CREATE TABLE Flags
(
    CountryOrRegion NVARCHAR (30) NOT NULL,
    FlagColors VARCHAR (200)
);

CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(CountryOrRegion);

INSERT INTO Flags VALUES ('France', 'Blue and White and Red');
INSERT INTO Flags VALUES ('Italy', 'Green and White and Red');
INSERT INTO Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');

SELECT * FROM Flags;
GO

CREATE FULLTEXT CATALOG TestFTCat;

CREATE FULLTEXT INDEX ON Flags (FlagColors) KEY INDEX FlagKey
    ON TestFTCat;
GO

SELECT * FROM Flags;

SELECT *
FROM CONTAINSTABLE (Flags, FlagColors, 'Green')
ORDER BY RANK DESC;

SELECT *
FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black')
ORDER BY RANK DESC;

B. 傳回排名值

下列範例會搜尋包含單字 framewheeltire的所有產品名稱,並會為每個單字提供不同的權重。 針對符合這些搜尋準則的每個傳回數據列,會顯示相符項目的相對接近性(排名值)。 此外,會先傳回最高排名的數據列。

USE AdventureWorks2022;
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

C. 傳回大於指定值的排名值

適用於:SQL Server 2012 (11.x) 和更新版本。

下列範例會使用 NEAR 在資料表中bracket搜尋reflector彼此Production.Document並彼此接近。 只會傳回排名值為50或更高的數據列。

USE AdventureWorks2022;
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。

D. 使用top_n_by_rank傳回前五名排名的結果

下列範例會傳回前五名產品的說明,其中欄包含Description單字aluminum或單字light附近的單字lightweight

USE AdventureWorks2022;
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

E. 指定 LANGUAGE 引數

下列範例示範如何使用 LANGUAGE 自變數。

USE AdventureWorks2022;
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 引數