2009-07-08 51 views
1

我正在写一个相当复杂的存储过程来搜索图像库。MS-SQL 2005搜索:条件where子句与自由文本

我要使用视图和写入动态SQL查询视图,但我需要使用全文索引,并且我认为需要外连接(MS-SQL 2005 full-text index on a view with outer joins

所以,我回来一个存储过程。

我需要在(所有可选)搜索:

  • 使用全文索引(或没有搜索字词)
  • 一个或多个类别(或无)
  • 一般的搜索查询一个标记(或没有)

有没有办法在'WHERE'子句中执行条件FREETEXT?查询可能是空的,在这种情况下,我想忽略它,或者只是返回所有FTI匹配。

... AND FREETEXT(dbo.MediaLibraryCultures.*, '"* "')似乎不起作用。不确定案例陈述如何在这里工作。

我最好将类别/标记过滤器结果插入临时表/表变量,然后加入FTI搜索结果?这样,我只能在提供搜索词时进行连接。

想法?

+0

请多关注您的标签选择。 'sql-server'outnumbers'mssql'6000:1 – 2009-07-08 03:18:21

+0

谢谢。这将是很好的合并和删除这些重复标签... – ScottE 2009-07-08 11:44:18

回答

0

嗯,我认为在sql server中没有短路?

AND (@q = '' OR FREETEXT(dbo.MediaLibraryCultures.*, @q)) 

似乎工作得很好!

奇怪的是,全文扫描仍然是执行计划的一部分。

+0

有趣的是,全文搜索在执行计划中 - 我认为查询优化器会将@q和''看作常量并排除整个检查(使得任何短路都不相关,因为它甚至不会包含在结束查询),但我猜想,因为查询可以影响优化器无法承担的每行的变量。我也有兴趣了解执行计划中的全文搜索是否占用大量时间? 此外,如果这是您正在运行的答案,请将其标记为接受的答案? – Tetraneutron 2009-07-08 23:14:46

0

你可以添加一个检查,如空搜索字符串

where ... 
AND (FREETEXT(dbo.MediaLibraryCultures.*, @FreeTextSearchFor) OR @FreeTextSearchFor = '') 

(我有自由文本搜索已经不能为空传递到他们的感觉,所以我比较空字符串)

如果要搜索的项是空的,则整个子句将评估为true,因此不会对返回的行应用限制(当然,因为它将常量与变量进行比较) - I会认为优化器会起作用并且不会为每一行执行比较。

+0

不,谓词不能为空或空。 – ScottE 2009-07-08 12:57:04

1

我知道这是一年后和SQL的一个新版本,但仅供参考...

我使用SQL Server 2008和使用

AND (@searchText = '' OR freetext(Name, @searchText)) 

试图短路和我收到消息设置@searchText =''时为“空或全空全文谓词”。我想2008年的事情已经发生了变化,这使得在这种情况下工作短路。

0

不适用于SQL Server 2014。我在其中一个存储过程中尝试了建议的短路,但它一直在评估FREETEXT表达式。我找到的唯一解决方案如下:

IF ISNULL(@Text, N'') = N'' SET @Text = N'""' 

SELECT ... 
    WHERE ... 
    AND (@Text = '""' OR FREETEXT([Data], @Text)