我有一个基本的存储过程,通过传入
@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
在将 @Keyword 参数传递到 SQL 语句之前,您必须对其进行一些预处理。 SQL 期望关键字搜索将由布尔逻辑分隔或用引号引起来。因此,如果您要搜索该短语,则必须将其放在引号中:
SET @Keyword = '"this is a search item"'
如果您想搜索所有单词,那么您需要类似
SET @Keyword = '"this" AND "is" AND "a" AND "search" AND "item"'
有关更多信息,请参阅 T-SQL CONTAINS 语法,特别是查看示例部分。
作为附加说明,请务必替换双引号字符(用空格),这样就不会弄乱全文查询。有关如何执行此操作的详细信息,请参阅此问题:SQL Server 全文搜索转义字符?
根据 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
为空时:
""
对于使用 2016 年之前的 SQL Server 的用户,您可以使用以下 SQL 来格式化您的搜索查询字符串:
DECLARE @ContentsSearchTerm VARCHAR(500) = REPLACE(@SearchTerm, '"',' ');
SET @ContentsSearchTerm = '"' + REPLACE(@ContentsSearchTerm, ' ', '*" AND "') + '*"';
这将生成一个查询字符串,您可以传递给 CONTAINS 或 FREETEXT,如下所示:
'"this*" AND "is*" AND "a*" AND "search*" AND "item*"'
示例:“您要搜索的文本类似”==> 更新:“文本%喜欢%这个%你%想要%搜索”
代码示例:
declare @text as nvarchar(50) = 'test text'
set @text = REPLACE(@text,' ','%')
SELECT TOP (1000) [id]
,[value]
,[body]
FROM [test].[dbo].[Table_1]
where CONTAINS([body],@text)
如果您想使用全文搜索,请不要忘记在您的 mssql 上安装它