Tsql 在全文搜索输入字符串中使用多个单词

Tsql 在全文搜索输入字符串中使用多个单词,tsql,sql-server-2008,full-text-search,Tsql,Sql Server 2008,Full Text Search,我有一个基本存储过程,它通过传入@关键字参数,对表中的3列执行全文搜索。用一个单词就可以了,但当我试着输入多个单词时,它就失败了。我不知道为什么。错误显示: 全文搜索条件“这是搜索项”中“搜索项”附近的语法错误 SELECT S.[SeriesID], S.[Name] as 'SeriesName', P.[PackageID], P.[Name] FROM [Series] S INNER JO

我有一个基本存储过程,它通过传入
@关键字
参数,对表中的3列执行全文搜索。用一个单词就可以了,但当我试着输入多个单词时,它就失败了。我不知道为什么。错误显示:

全文搜索条件“这是搜索项”中“搜索项”附近的语法错误

SELECT     S.[SeriesID], 
           S.[Name] as 'SeriesName',
           P.[PackageID],
           P.[Name]     
FROM       [Series] S
INNER JOIN [PackageSeries] PS ON S.[SeriesID] = PS.[PackageID]
INNER JOIN [Package]       P  ON PS.[PackageID] = P.[PackageID]
WHERE CONTAINS ((S.[Name],S.[Description], S.[Keywords]),@Keywords)
AND   (S.[IsActive] = 1) AND (P.[IsActive] = 1) 
ORDER BY [Name] ASC

在将@Keyword参数传递到SQL语句之前,必须对其进行一些预处理。SQL希望关键字搜索将由布尔逻辑分隔或用引号括起来。因此,如果您要搜索短语,则必须在引号中:

SET @Keyword = '"this is a search item"'
如果你想搜索所有的单词,那么你需要

SET @Keyword = '"this" AND "is" AND "a" AND "search" AND "item"'
有关更多信息,请参阅,特别是查看示例部分


另外要注意的是,请确保替换双引号字符(用空格),这样就不会打乱全文查询。有关如何执行此操作的详细信息,请参见此问题:

继Aaron的回答之后,如果您使用的是SQL Server 2016或更高版本(130),则可以使用内置字符串功能预处理输入字符串。例如

SELECT
    @QueryString = ISNULL(STRING_AGG('"' + value + '*"', ' AND '), '""')
FROM
    STRING_SPLIT(@Keywords, ' ');
它将生成一个查询字符串,您可以将其传递到
CONTAINS
FREETEXT
,如下所示:

'"this*" AND "is*" AND "a*" AND "search*" AND "item*"'
或者,当
@Keywords
为空时:

""

非常感谢。我不知道为什么我看的MSDN文档没有这个简单但非常常见的示例。@Aaron如果使用MATCH而不是CONTAINS,这和运算符工作吗?因为我没有得到匹配条件的任何输出,我们如何搜索包含“”的短语?我们是使用double“”还是语法?