我有基本的存储过程,通过传入@Keyword
参数对表中的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
答案 0 :(得分:40)
在将@Keyword参数传递给SQL语句之前,您必须对其进行一些预处理。 SQL期望关键字搜索将由布尔逻辑分隔或用引号括起来。因此,如果您要搜索该短语,则必须使用引号:
SET @Keyword = '"this is a search item"'
如果你想搜索所有单词,那么你需要像
这样的东西SET @Keyword = '"this" AND "is" AND "a" AND "search" AND "item"'
有关详细信息,请参阅T-SQL CONTAINS syntax,特别注意示例部分。
作为补充说明,请务必更换双引号字符(带空格),这样就不会弄乱全文查询。有关如何执行此操作的详细信息,请参阅此问题:SQL Server Full Text Search Escape Characters?
答案 1 :(得分:0)
对于 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
为空时:
""