CONTAINSTABLE (Transact-SQL)

更新日期: 2006 年 7 月 17 日

返回具有零行、一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短语的完全匹配或模糊匹配(不完全相同)项、某个词在一定范围内的近似词或者加权匹配项。 CONTAINSTABLE 可以像一个常规的表名称一样,在 SELECT 语句的 FROM 子句中引用。

使用 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 的十六进制值。 十六进制值不能超过八位(包括前导零在内)。

    如果该值是双字节字符集 (DBCS) 格式,则 Microsoft SQL Server 会将其转换为 Unicode 格式。

    如果指定的语言无效,或者没有安装对应于该语言的资源,SQL Server 将出错。 若要使用非特定语言资源,请将 0x0 指定为 language_term

  • top_n_by_rank
    指定只返回以降序排列的前 n个排名最高的匹配项。 仅当指定了整数值 n 时适用。 如果执行其他筛选操作,则返回的结果可能少于 n 个。
  • <contains_search_condition>
    指定要在 column_name 中搜索的文本和匹配条件。 有关详细信息,请参阅 CONTAINS (Transact-SQL)

备注

返回的表中有一列名为 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 以及给定每个词的不同加权的所有产品名称。 对于与此搜索条件相匹配的每个返回行,都将显示匹配的相关程度(排名值)。 此外,排名最高的行将首先返回。

ms189760.note(zh-cn,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 返回大于指定值的排名值

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

ms189760.note(zh-cn,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 位的结果

对于在词“sauces”或“candies”附近包含“sweet and savory”的 Description 列,以下示例将返回其前 10 种食品的说明和类别名称。

ms189760.note(zh-cn,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-cn,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 参数的示例。