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