3

ここで説明されているような問題が発生しています。

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

populate ステータスは 9 のままで、トランザクションが保留中の間、select は行を返しません。コミットすると、移入ステータスは0を返し、選択は期待どおりに単一の行を返します。

何か不足していますか?これを達成する別の方法はありますか?この動作は、SQL Server のバージョンが異なると異なりますか? (私は現在2008を使用してテストしています)

4

2 に答える 2

1

あなたは運が悪いと思います。トランザクション内で手動更新を開始しようとしています...

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

...次のメッセージが表示されます。

メッセージ 574、レベル 16、状態 0、行 1 ALTER FULLTEXT INDEX ステートメントは、ユーザー トランザクション内では使用できません。

どのような選択肢があるかは、単体テストの管理方法に依存する可能性があります。おそらくDELETE、データだけを再度DROP使用することも、このテストにのみ使用される場合はテーブルを完全に使用することもできます。

于 2013-01-10T20:56:06.207 に答える