Sql-Server

如何跨片語列表執行全文 CONTAINS 呼叫?

  • July 23, 2016

我有一個表中的單詞/片語列表phrasesdescription我有另一個表,其中包含索引該列的全文目錄。

我想results用每個片語的記錄填充一個表,以及在描述中找到這些片語的次數:

INSERT INTO results(phrase, foundcount)
SELECT  phrase, 
   (SELECT COUNT(*) FROM table WHERE CONTAINS(table.description, phrase))
FROM    phrases;

無論我如何嘗試,這都會導致錯誤:

Incorrect syntax near `phrase`. Expecting STRING, TEX_LEX, or VARIABLE

我真的寧願不使用游標,這樣我就可以將每個游標分配phrase給一個變數。這真的是唯一的選擇嗎?

嘗試這個:

go
create function dbo.fn_GetCountForPhrase (@phrase varchar(500))
   returns  int
as
begin
   declare @count int
   declare @localphrase varchar(8000)
   set @localphrase='"' + @phrase + '"'
   SELECT @count=COUNT(*) FROM table  a WHERE CONTAINS(table.description,   @localphrase)
   return @count
end
go
SELECT  
   phrase,  
   dbo.fn_GetCountForPhrase(phrase) 
FROM phrases 

我認為您可以從 DMV 獲得所需的內容,包括sys.dm_fts_index_keywords_by_documentand sys.dm_fts_parser,如下所示:

SELECT p.phrase, kbd.display_term
FROM sys.dm_fts_index_keywords_by_document( DB_ID(), OBJECT_ID('dbo.documentText') ) kbd
   CROSS APPLY dbo.phrases p
       CROSS APPLY sys.dm_fts_parser  ( N'FORMSOF(FREETEXT, "' + phrase + N'")', 1033, 0, 1 ) x
WHERE x.display_term = kbd.display_term

注意:如果您將搜尋用引號括起來,您會得到完全匹配的結果,因此您並沒有真正獲得全文索引的好處。您也可以使用Like和萬用字元(%)來做到這一點。標量函式也不能很好地擴展到大型結果集。

引用自:https://dba.stackexchange.com/questions/144593