2010-08-23 27 views
6

Tôi đang cố gắng tìm ra cách lấy mã sau đây để trả về hàng mà nó vừa chèn vào - một đồng nghiệp chỉ ra và đề xuất chạy ALTER FULLTEXT CATALOG uiris_production REBUILD nhưng không thể chạy trong giao dịch người dùng.Làm cách nào để buộc làm mới chỉ mục toàn văn trong một giao dịch trong mssql?

Lý do điều này phải có trong giao dịch là điều này đến từ một khung kiểm tra nơi thử nghiệm được bao bọc trong một giao dịch và sau đó được khôi phục.

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

Nó không phải là một bài kiểm tra đơn vị nếu nó chạm vào cơ sở dữ liệu (hoặc bất kỳ nguồn dữ liệu ngoài nào khác) –

Trả lời

3

Trước tiên, hãy đảm bảo chỉ mục văn bản đầy đủ của bạn được thiết lập để theo dõi thay đổi tự động. change_tracking_state phải là 'A' cho truy vấn này.

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' 

Nhưng, ngay cả với theo dõi thay đổi tự động, có một mức độ nhất định về độ trễ trong việc cập nhật toàn văn. Bạn có thể cần phải xây dựng một WAITFOR vào bài kiểm tra đơn vị của bạn để phù hợp với điều này.

+0

Ngay cả khi đã bật theo dõi thay đổi tự động, có vẻ như các chỉ mục toàn văn chỉ được cập nhật khi giao dịch được thực hiện để waitfor sẽ không ảnh hưởng. Điều này dường như không thể làm được ... :( – ajbeaven

-2
SELECT SCOPE_IDENTITY() 

sẽ cho bạn biết id của bản ghi mà bạn vừa tạo.

+0

Op là yêu cầu làm thế nào để có được toàn bộ hàng; không chỉ là id. Có lẽ bạn cũng có thể đề xuất với họ rằng họ lấy id từ hàng được chèn vào, sau đó thực hiện tra cứu SELECT trên id đó? –

Các vấn đề liên quan