7645空或全空全文谓词

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

问题的代码是调用CONTAINS,CONTAINSTABLE或FREETEXT与一个空的参数。 但是,我试图只有打电话或join时,有这样的价值

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 

不过,我无法find任何解决方法,这对SQL2008工作。 有任何想法吗?

我知道我可以做dynamicSQL或有两个不同情况下的if语句(selectFTjoin,select没有FTjoin。任何更好的解决方法,不需要这样做?

我今天在将自己的数据库从SQL 2005转换为SQL 2008时发现了这个答案。

通过""search字词并将@search_term = ''testing更改为@search_term = '""' SQL服务器将忽略双引号并且不会引发错误。

例如,下面实际上会返回Users表中的所有logging:

 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/

这个解决scheme在SQL 2008上不适合我。答案似乎很清楚,并被认为是有用的,但我会得到超过2Mlogging的表。 事实上,它locking了一个只在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)) 

FTS和OR操作数的问题已在SP2 CU4中修复。 如果您在该级别或更高版本,OR条件应该运行正常,无需UNION。 我们尝试了SP2 CU8的最新更新,而且FTS现在也可以使用。 此外,像现在这样失败的3.12之类的search就可以正常工作了。

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

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

干得好 –

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