Sql-Server

在儲存過程中創建和使用全文索引

  • March 15, 2017

我想在單個過程中創建和使用全文索引。例如:

CREATE PROC [dbo].[dbp_PCL_to_Demo_Matching_Mason] AS

--IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = OBJECT_ID('Medicaid_State_Claims'))
   CREATE FULLTEXT INDEX ON dbo.Medicaid_State_Claims(Scrubbed_Account_Number)
     KEY INDEX nci_Seq_No;

select * from dbo.Medicaid_State_Claims
 where CONTAINS(Scrubbed_Account_Number, 'blahblah');

但是,這會失敗並顯示錯誤消息:

不能對錶或索引視圖“dbo.Medicaid_State_Claims”使用 CONTAINS 或 FREETEXT 謂詞,因為它不是全文索引。

取消註釋“如果不存在”條件沒有任何區別。但是,如果索引已經存在並且我取消註釋該行並創建儲存過程,它就可以工作。但我寧願不提前創建它,我想在儲存過程中創建它。如何創建全文索引並在同一個儲存過程中使用它?

我不相信你可以,至少不能在同一個過程中。

儲存的過程在執行之前被編譯,因此將在執行之前檢查該命令的有效性。

全文是一個完全獨立的執行檔,雖然您當然可以發出 SQL 命令來創建新的全文索引,或者啟動一個重建索引,或者其他什麼,但這些命令不會像普通的 SQL 命令那樣工作(它們可以’不在 ATOmic 事務中,它們不可能回滾,等等)。

這意味著僅僅因為CREATE FULLTEXT INDEX語句成功,並不能保證索引已填充和/或有用

這就像發出msdb.dbo.sp_start_job執行 SQL 代理作業一樣。該語句很快完成並返回控制權,但代理很可能仍在執行(很長一段時間)。

也許您可以通過呼叫單獨的儲存過程來欺騙它,一個創建全文索引並啟動完整建構,然後另一個檢查該建構的狀態並循環直到它完成,然後呼叫執行查詢的過程?

在我看來,您可能會通過執行 normal 更快地返回一個值WHERE Scrubbed_Account_Number LIKE '%blahblah%',即使這會執行全表掃描。

事實上,我保證會更快,因為它必須進行全表掃描才能建構全文索引。

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