2009-07-08 50 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)