CONTAINSTABLE (Transact-SQL)

返回由包含以下项的字符数据类型的列组成的零行、一行或多行表:单个词或短语的完全匹配项或模糊匹配项、词在一定差别范围内的相近或加权匹配项。只能在 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 可以是由一个部分、两个部分、三个部分或四个部分组成的数据库对象名称。查询视图时,仅能涉及一个全文索引的基表。

    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) 将决定为其内容编制索引时使用的语言。在对这种列进行查询时,指定 LANGUAGElanguage_term 可增大找到有效匹配项的可能性。

    如果指定为字符串,language_term 将对应于 sys.syslanguages 兼容性视图中的 alias 列值。字符串必须用单引号引起来,如 'language_term'。如果指定为整数,则 language_term 就是标识该语言的实际 LCID。如果指定为十六进制值,则 language_term 将以 0x 开头,后跟 LCID 的十六进制值。十六进制值不能超过八位(包括前导零在内)。

    如果该值是双字节字符集 (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 属性标识此唯一键列。若要获得与全文索引的全文键相关联的列 ID,请使用 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 的所有产品名称,并为每个词指定了不同的加权。对于满足此搜索条件的每个返回行,都将显示匹配的相关程度(排名值)。此外,排名最高的行将首先返回。

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 返回大于指定值的排名值

对于在词 sauces 或 candies 附近包含 "sweet and savory" 的 Description 列,以下示例返回其所有食品类别的说明和类别名称。将忽略具有 Seafood 类别名称的所有行。仅返回排名值为 2 或排名值更高的行。

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 位的结果

下面的示例将返回符合以下条件的前 10 个食品类别的说明和类别名称:Description 列中词“sauces”或“candies”附近存在词“sweet and savory”。

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];
注意注意

使用 top_n_by_rank. 时,LANGUAGE language_term 参数不是必需的