我有一个在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连接.任何更好的解决方法,不需要这样做?
今天我将自己的数据库从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,你可能会获得一份EW Bachtal的FullTextSearch课程.他的网站内容非常丰富:http://ewbi.blogs.com/develops/
这个解决方案在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))