2010-08-23 37 views
6

我想弄清楚如何讓下面的代碼返回它剛剛插入的行 - 一名同事指出並建議運行ALTER FULLTEXT CATALOG uiris_production REBUILD,但不能在用戶事務中運行。如何在mssql中的事務中強制刷新全文索引?

這必須在事務中的原因是,這是來自測試框架,其中測試包裝在事務中,然後回滾。

declare @search varchar(64) 
set @login_test = 'foobar' 
set @search = '"' + @login_test + '*"' 

begin transaction 
    insert into users(login) values (@login_test) 
    select login from users where contains(login, @search) 
commit 
+0

如果它觸及數據庫(或任何其他外部數據源),則不是單元測試 – 2010-08-23 15:01:43

回答

3

首先,確保您的全文索引設置爲自動更改跟蹤。此查詢的change_tracking_state應該是'A'。

select t.name, fi.change_tracking_state 
    from sys.fulltext_indexes fi 
     inner join sys.tables t 
      on fi.object_id = t.object_id 
    where t.name = 'users' 

但是,即使有自動更改跟蹤,全文更新也存在一定程度的延遲。您可能需要在單元測試中創建一個WAITFOR以適應此情況。

+0

即使啓用了自動更改跟蹤,它看起來好像全文索引僅在事務提交時才更新,因此waitfor不會產生任何影響。這似乎不可能做...... :( – ajbeaven 2015-05-26 05:47:27

-2
SELECT SCOPE_IDENTITY() 

會告訴你,你剛剛創建的記錄的ID。

+0

該操作詢問如何獲取整行;不僅是id。也許你也可以建議他們從插入的行中獲取id,然後對該id進行SELECT查找? – 2012-11-13 12:52:13