当前位置:  开发笔记 > 数据库 > 正文

7645空或全空谓词

如何解决《7645空或全空谓词》经验,为你挑选了2个好方法。

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



1> NotMe..:

今天我将自己的数据库从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/


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

2> 小智..:

这个解决方案在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)) 


您可能遇到的问题是由于我所拥有的问题绝不是优化的.最近我发现在WHERE子句中使用UNION代替OR运行速度要快几倍.所以+1
推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有