【问题标题】:How do I force a refresh of a fulltext index within a transaction in mssql?如何在 mssql 的事务中强制刷新全文索引?
【发布时间】:2010-08-23 14:38:14
【问题描述】:

我试图弄清楚如何让以下代码返回它刚刚插入的行 - 一位同事指出并建议运行 ALTER FULLTEXT CATALOG uiris_production REBUILD 但不能在用户事务中运行。

这必须在事务中的原因是它来自测试框架,其中测试被包装在事务中,然后回滚。

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

【问题讨论】:

  • 如果接触到数据库(或任何其他外部数据源)就不是单元测试

标签: sql sql-server full-text-search


【解决方案1】:

首先,确保您的全文索引已设置为自动更改跟踪。对于此查询,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 以适应这种情况。

【讨论】:

  • 即使启用了自动更改跟踪,看起来全文索引仅在事务提交时才更新,因此 waitfor 不会有任何影响。这似乎不可能做到...... :(
【解决方案2】:
SELECT SCOPE_IDENTITY()

会告诉你刚刚创建的记录的 id。

【讨论】:

  • 操作询问如何获取整行;不仅是身份证。也许您也可以建议他们从插入的行中获取 id,然后对该 id 进行 SELECT 查找?
猜你喜欢
  • 2023-03-04
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
相关资源
最近更新 更多