39

我有一个在 SQL2005 上运行良好的查询,但是将数据库移动到 SQL2008 给了我标题中的错误。

出现问题的代码是使用空参数调用 CONTAINS、CONTAINSTABLE 或 FREETEXT。但是我试图只在有这样的值时打电话或加入

where (@search_term = '' or (FREETEXT(lst.search_text, @search_term)))

或者

left join containstable (listing_search_text, search_text,  @search_term) ftb on l.listing_id = ftb.[key] 
    and len(@search_term) > 0

但是我找不到任何解决方法可以在 SQL2008 上运行。有任何想法吗?

我知道我可以执行动态 SQL 或使用两种不同情况的 if 语句(使用 FT 连接选择,选择没有 FT 连接。有什么更好的解决方法不需要这样做吗?

4

5 回答 5

57

我今天在将自己的数据库从 SQL 2005 转换为 SQL 2008 时找到了答案。

通过""您的搜索词并将 @search_term = ''test 更改为@search_term = '""' SQL 服务器将忽略双引号并且不会引发错误。

例如,以下内容实际上会返回 Users 表中的所有记录:

declare  @SearchTerm nvarchar(250)

SET @SearchTerm = '""'

select UserId, U.Description, U.UserName
from dbo.Users U
WHERE ((@SearchTerm = '""') OR CONTAINS( (U.Description, U.UserName), @SearchTerm))

如果您使用的是 .Net,您可能会获取一份 EW Bachtal 的 FullTextSearch 类的副本。他的网站信息量很大:http ://ewbi.blogs.com/develops/

于 2008-12-07T04:38:48.583 回答
14

这个解决方案在 SQL 2008 上对我不起作用。答案似乎很清楚,被认为很有用,但我会在有 2M 记录的表上超时。事实上,它锁定了一个在 SSMS 中运行查询的服务器。

它似乎不喜欢 where 子句中的 OR,但我可以很好地运行查询来分隔条件。

我最终成功地使用了 UNION 作为解决方法。

declare  @SearchTerm nvarchar(250)

SET @SearchTerm = '""'

select UserId, U.Description, U.UserName
from dbo.Users U
WHERE ((@SearchTerm = '""') 

UNION 

select UserId, U.Description, U.UserName
from dbo.Users U
WHERE CONTAINS( (U.Description, U.UserName), @SearchTerm)) 
于 2011-03-06T08:58:49.600 回答
3

只需添加双引号。 您可以检查空字符串,然后在其中添加双引号。

Set @search_term = case when @search_term = '' then '""' else @Address End

干得好 -

where (@search_term = '""' or (FREETEXT(lst.search_text, @search_term)))
于 2017-08-09T10:27:14.100 回答
1

FTS 和 OR 操作数的问题已在 SP2 CU4 中修复。如果您处于该级别或更高级别,则 OR 条件应该运行正常而无需 UNION。我们尝试了 SP2 CU8 的最新更新,FTS 现在可以与 OR 一起使用。此外,以前会失败的搜索(例如 3.12)现在工作得很好。

于 2013-12-10T19:51:19.750 回答
1

我发现如果 SQL-Server配置为忽略“干扰词”,则使用“a”作为默认值。

SET @SearchPhrase = coalesce(@SearchPhrase, 'a'); /* replace with 'a' if null parameter */ 
SELECT ... WHERE 
    (@SearchPhrase = 'a' OR contains(Search_Text, @SearchPhrase)) 
于 2021-04-19T22:51:10.450 回答