我很惊讶地发现,CONTAINS
或CONTAINSTABLE
似乎都不支持以下语法,您可以为最后一个搜索条件参数传递列名。
SELECT *
FROM dbo.Articles AS a
WHERE EXISTS
(
SELECT *
FROM dbo.Terms AS t
INNER JOIN CONTAINSTABLE(dbo.Articles, (ArticleBody), t.FulltextTerm)
AS ct ON ct.[Key] = a.ArticleId
)
上述查询返回“'t'附近的语法不正确”错误消息。
Terms
表包含多行FulltextTerm
列,如果这些FulltextTerm
值中的任何一个在ArticleBody中,则它应该匹配,以便选择特定的文章。这就是我想要实现的目标。
CONTAINS
和CONTAINSTABLE
似乎只支持搜索条件参数的字符串文字或变量,这是非常有限的。如果这是唯一的选择,它需要更多的代码,如果我需要通过游标或循环遍历Terms
表,它肯定会慢得多。
我在这里错过了一个技巧,或者有人可以建议的任何变通方法 - 最好是基于集合的解决方案,即避免循环。
答案 0 :(得分:0)
如何将所有术语合并到一个变量中,然后使用CONTAINSTABLE,如下所示:-
declare @term as table(
FulltextTerm nvarchar(60)
)
insert into @term values ('light NEAR aluminum')
insert into @term values ('lightweight NEAR aluminum')
Declare @FulltextTerm nvarchar(max)=''
select @FulltextTerm=@FulltextTerm+' OR ('+FulltextTerm+')' from @term
set @FulltextTerm=SUBSTRING(@FulltextTerm,5,99999)
-- @FulltextTerm will have the below value:-
-- (light NEAR aluminum) OR (lightweight NEAR aluminum)
SELECT *
FROM dbo.Articles AS a
INNER JOIN
CONTAINSTABLE (dbo.Articles,ArticleBody,@FulltextTerm) AS ct
ON ct.[Key] = a.ArticleId
当然,在您不需要表变量@term的情况下,可以将其替换为Term表,但是我仅在这里使用它来显示想法。
我相信这可能比循环更好。
注意:我不知道您拥有的数据库版本,但是如果可以使用STRING_AGG函数,甚至可以使用以下版本
select @FulltextTerm=STRING_AGG('('+FulltextTerm+')',' OR ') from @term