7645空或全空谓词

时间:2008-10-10 00:58:08

标签: sql-server full-text-search

我有一个在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连接。任何更好的解决方法,不需要这样做?

5 个答案:

答案 0 :(得分:53)

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

为您的搜索字词传递"",并将@search_term = ''测试更改为@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,你可能会获得E. W. Bachtal的FullTextSearch类的副本。他的网站提供了非常丰富的信息:http://ewbi.blogs.com/develops/

答案 1 :(得分: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)) 

答案 2 :(得分:2)

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

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

你去吧 -

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

答案 3 :(得分:1)

FTS和OR操作数的问题在SP2 CU4中得到修复。如果您在该级别或更高级别,则OR条件应该运行正常而不必使用UNION。我们尝试了最近更新的SP2 CU8和FTS现在与OR一起使用。此外,之前失败的3.12之类的搜索工作正常。

答案 4 :(得分:1)

我发现如果 SQL-Server 是 configured to ignore "noise words".

SET @SearchPhrase = coalesce(@SearchPhrase, 'a'); /* replace with 'a' if null parameter */ 
SELECT ... WHERE 
    (@SearchPhrase = 'a' OR contains(Search_Text, @SearchPhrase))