Sql-Server
如何跨片語列表執行全文 CONTAINS 呼叫?
我有一個表中的單詞/片語列表
phrases
。description
我有另一個表,其中包含索引該列的全文目錄。我想
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_document
andsys.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
和萬用字元(%
)來做到這一點。標量函式也不能很好地擴展到大型結果集。