7645空或全空谓词

mja*_*day 36 sql-server full-text-search

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

问题的代码是使用空参数调用CONTAINS,CONTAINSTABLE或FREETEXT.但是当我有这样的值时,我只想调用或加入

where (@search_term = '' or (FREETEXT(lst.search_text, @search_term)))
Run Code Online (Sandbox Code Playgroud)

要么

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

但是我找不到任何解决方法来处理SQL2008.有任何想法吗?

我知道我可以做动态SQL或者有一个带有两种不同情况的if语句(选择FT连接,选择没有FT连接.任何更好的解决方法,不需要这样做?

Not*_*tMe 54

今天我将自己的数据库从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))
Run Code Online (Sandbox Code Playgroud)

如果你使用的是.Net,你可能会获得一份EW Bachtal的FullTextSearch课程.他的网站内容非常丰富:http://ewbi.blogs.com/develops/

  • (@SearchTerm ='""')谓词偶尔添加极大量的读取和查询超时(如whiplashtony所述) (3认同)

小智 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)) 
Run Code Online (Sandbox Code Playgroud)

  • 您可能遇到的问题是由于我所拥有的问题绝不是优化的.最近我发现在WHERE子句中使用UNION代替OR运行速度要快几倍.所以+1 (3认同)