如何从SQL Server事务中刷新全文索引

时间:2013-01-10 18:04:05

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

我遇到类似于此处描述的问题:

How do I force a refresh of a fulltext index within a transaction in mssql?

但是,在那里发布的推荐解决方案不起作用。我尝试在同一个帖子上发布跟进,但主持人已将其删除。所以我开始提出一个新问题。

与原始查询类似,我也尝试在事务中实现单元测试。我想将数据插入到全文索引列中,查询数据以检查其有效性,然后在之后回滚插入。

问题是索引似乎在我提交事务之后才更新。我尝试了“WAITFOR DELAY”方法,但无论我等待多长时间,索引都不会更新,直到事务提交后才会更新。

以下是我正在尝试做的一个示例:

BEGIN TRAN

INSERT INTO AMMS.Content
(
    ContentTypeId,
    Name,
    ImportDate,
    IsDeleted,
    LastModifiedBy,
    LastModifiedAt,
    DisplayInPortal,
    StatusId
)
VALUES
(
    4,
    'my unit test content',
    GETUTCDATE(),
    0,
    1,
    GETUTCDATE(),
    1,
    2
)

declare @count int
set @count = 0
while @count < 10
begin
    SELECT FULLTEXTCATALOGPROPERTY('PRIMARY', 'PopulateStatus') AS Status
    select * from amms.Content where contains(Name, 'unit')
    waitfor delay '00:00:01'
    set @count = @count + 1
end

填充状态保持为9,只要事务处于挂起状态,select就不会返回任何行。一旦我提交,填充状态返回0并且select按预期返回单行。

我错过了什么吗?还有另一种方法来实现这一目标吗?在不同版本的SQL Server下,此行为是否不同? (我目前正在使用2008测试)

2 个答案:

答案 0 :(得分:1)

我觉得你运气不好。尝试在事务中启动手动刷新...

begin tran
alter fulltext index on dbo.FTS_Table start full population

...给我这条消息:

  

Msg 574,Level 16,State 0,Line 1 ALTER FULLTEXT INDEX声明   不能在用户事务中使用。

您可能有哪些替代方案可能取决于您如何管理单元测试,也许您可​​以再次DELETE数据,或者如果表仅用于此测试则完全DROP表。

答案 1 :(得分:0)

基本上,SQL Server不允许您在事务(或快照)中执行某些操作。

索引服务特别故意在用户连接外部运行,因为存在争用风险和巨大的文本索引限制。

如果您退一步考虑其他任何数据库连接的影响,并考虑当前的一个事务重写全文索引,我相信您会明白,在这种情况下,Microsoft有一个点。