对于包含基于字符的数据类型的列(该列与单个词和短语,以及与另一个词一定范围之内的近似词精确或模糊(不太精确的)匹配或者加权匹配),返回具有零行、一行或多行的表。CONTAINSTABLE 可以在 SELECT 语句的 FROM 子句中引用,就好象它是一个常规的表名称。
使用 CONTAINSTABLE 的查询将指定对每一行返回一个适当等级值 (RANK) 的包含类型的全文查询。CONTAINSTABLE 函数使用与 CONTAINS 谓词相同的搜索条件。
CONTAINSTABLE ( table ,
{ column | *
} , ' < contains_search_condition > '
[ , 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> ::=
< generation_term > ::=
FORMSOF ( INFLECTIONAL , < 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 可以是由一部分、两部分或三部分组成的数据库对象名称。 有关更多信息,请参见 Transact-SQL 语法规则。table 不能指定服务器名称,也不能用于对链接服务器的查询。
column
驻留在 table 中的要搜索的列名。字符串数据类型的列是有效的全文检索列。
*
指定表中所有已注册全文检索的列都必须用于搜索给定的包含搜索条件。
top_n_by_rank
指定只返回以降序排列的前 n 个最高等级的匹配项。仅当指定了整数值 n 时应用。
<contains_search_condition>
指定要在 column 中搜索的文本。变量不能用作搜索条件。有关更多信息,请参见 CONTAINS。
返回的表中有一列名为 KEY,其中包含全文键值。每个全文索引表都有这样一列,它的值保证是唯一的,而且 KEY 列中的返回值都是与包含搜索条件中指定的选择标准相匹配的行的全文键值。从 OBJECTPROPERTY 函数获得的 TableFulltextKeyColumn 属性为这个唯一的 key 列提供标识。若要从原始表中获得所需要的行,请在 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 语句中,此等级值通常按照下列方法之一进行使用:
如果兼容级别小于 70,CONTAINSTABLE 不被看作是关键字。有关更多信息,请参见 sp_dbcmptlevel。
只有在表或被引用表的列上具有适当 SELECT 特权的用户才有执行权限。
下面的示例搜索包含词 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
对于包含位于词"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
对于包含位于词"sauces"或"candies"附近的"sweet and savory"的 Description 列,下面的示例返回其前 10 种食品的描述和分类名称。
相关文章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]