Sql-Server
在儲存過程中創建和使用全文索引
我想在單個過程中創建和使用全文索引。例如:
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%'
,即使這會執行全表掃描。事實上,我保證會更快,因為它必須進行全表掃描才能建構全文索引。