Share via


CONTAINSTABLE (Transact-SQL)

更新: 2006 年 7 月 17 日

針對包含以字元為基礎之資料類型的資料行,傳回含有零個、一個或多個資料列的資料表,這些資料行適用於單一文字或詞組的完全或部分 (較不精確) 相符、單字彼此在一定距離之間的接近度,或加權相符。您可以依照正規資料表名稱的相同方式,在 SELECT 陳述式的 FROM 子句中參考 CONTAINSTABLE。

使用 CONTAINSTABLE 的查詢會指定包含類型的全文檢索查詢,每個資料列都會傳回一個相關次序值 (RANK) 和全文檢索索引鍵 (KEY)。CONTAINSTABLE 使用與 CONTAINS 述詞相同的搜尋條件。

主題連結圖示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 > 
    | < 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 ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ] 
< weighted_term > ::= 
     ISABOUT
        ( { { 
  < simple_term > 
  | < prefix_term > 
  | < generation_term > 
  | < proximity_term > 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
        )

引數

  • table
    這是已標示全文檢索查詢的資料表名稱。table 可以是一段、兩段、三段或四部分資料庫物件名稱。
  • column_name
    這是 table 中所要搜尋的資料行名稱。charvarcharncharnvarchartextntextimagexmlbinaryvarbinary 等類型的資料行是全文檢索搜尋的有效資料行。
  • column_list
    指出您可以指定多個資料行,各資料行用逗號分隔。column_list 必須括在括號中。除非您指定了 language_term,否則,column_list 所有資料行的語言必須相同。
  • *
    指定資料表中登錄了全文檢索搜尋的所有資料行,都應該用來搜尋給定的包含搜尋條件。如果 FROM 子句中有多個資料表,就必須用資料表名稱來限定 *。除非您指定了 language_term,否則,資料表所有資料行的語言必須相同。
  • LANGUAGE language_term
    這是 CONTAINS 查詢利用其資源來斷詞、確立詞幹,以及移除同義字和贅字的語言。這個參數是選擇性的,可以指定成對應於語言地區設定識別碼 (LCID) 的字串、整數或十六進位值。如果指定了 language_term,就會將它代表的語言套用至搜尋條件的所有元素上。如果未指定任何值,就會使用資料行全文檢索語言。

    當指定為字串時,language_term 會對應至 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 時。如果執行其他篩選,就會傳回小於 n 個結果。
  • <contains_search_condition>
    指定 column_name 中所要搜尋文字,以及相符條件。如需詳細資訊,請參閱<CONTAINS (Transact-SQL)>。

備註

傳回的資料表有一個名稱為 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 子句中,傳回等級最高的資料列作為資料表中前面的資料列。
  • 在選取清單中,查看指派給每個資料列的等級值。

如果相容性層級低於 70,就不會將 CONTAINSTABLE 視為關鍵字。如需詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。

權限

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

範例

A. 利用 CONTAINSTABLE 傳回等級值

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

ms189760.note(zh-tw,SQL.90).gif附註:
若要執行這個範例,您必須安裝 Northwind 資料庫。如需有關如何安裝 Northwind 資料庫的詳細資訊,請參閱<下載 Northwind 和 pubs 範例資料庫>。
USE Northwind;
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
    FROM Categories AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Categories, Description, 
        'ISABOUT (breads weight (.8), 
        fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
            ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

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

下列範例會傳回 Description 資料行在 saucescandies 字附近包含 "sweet and savory" 等字的所有食物類別目錄的描述和類別目錄名稱。類別名稱為 Seafood 的所有資料列都會被忽略。只會傳回等級值大於或等於 2 的資料列。

ms189760.note(zh-tw,SQL.90).gif附註:
若要執行這個範例,您必須安裝 Northwind 資料庫。如需有關如何安裝 Northwind 資料庫的詳細資訊,請參閱<下載 Northwind 和 pubs 範例資料庫>。
USE Northwind;
GO
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)'
        ) AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
    AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

C. 利用 CONTAINSTABLE 和 top_n_by_rank 傳回前 10 個等級的結果

下列範例會傳回 Description 資料行在 "sauces" 或 "candies" 字附近包含 "sweet and savory" 等字的前 10 個食物類別目錄的描述和類別目錄名稱。

ms189760.note(zh-tw,SQL.90).gif附註:
若要執行這個範例,您必須安裝 Northwind 資料庫。如需有關如何安裝 Northwind 資料庫的詳細資訊,請參閱<下載 Northwind 和 pubs 範例資料庫>。
USE Northwind;
SELECT FT_TBL.Description, FT_TBL.CategoryName , KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)', 10)
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]

GO

D. 指定 LANGUAGE 引數

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

USE Northwind;

SELECT FT_TBL.Description , FT_TBL.CategoryName , KEY_TBL.RANK

FROM dbo.Categories AS FT_TBL

INNER JOIN CONTAINSTABLE (dbo.Categories, Description,

'("sweet and savory" NEAR sauces) OR

("sweet and savory" NEAR candies)',LANGUAGE N'English', 10)

AS KEY_TBL

ON FT_TBL.CategoryID = KEY_TBL.[KEY];

ms189760.note(zh-tw,SQL.90).gif附註:
使用 top_n_by_rank 時,並不需要使用 LANGUAGE language_term 引數

請參閱

參考

CONTAINS (Transact-SQL)
資料列集函數 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)

其他資源

使用全文檢索搜尋查詢 SQL Server

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2006 年 7 月 17 日

新增內容:
  • 加入 LANGUAGE 引數的範例。