Вот скрипт, который я создал с использованием курсоров для перестроения и заполнения полных индексов для любой таблицы, в которой есть один для MSSQL2008. Это работает в производственной среде с базами данных, перенесенными с сервера MSSQL 2000. Я отключил отслеживание изменений и просто запустил эту хранимую процедуру через агент SQL Server. Если вы использовали экспресс, вы могли бы использовать сценарий VBS для запуска его через планировщик задач.
В сценарии было важно выполнить перестройку сначала для каждого каталога, прежде чем пытаться заполнить индексы.
CREATE PROCEDURE [dbo].[rebuild_repopulate_fulltext]
AS
BEGIN
Declare @cmdA NVARCHAR(255)
Declare @cmdB NVARCHAR(255)
Declare @cmdC NVARCHAR(255)
DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE @fillfactor INT
DECLARE @Catalog VARCHAR(255)
DECLARE @Schema VARCHAR(255)
SET @fillfactor = 90
DECLARE DatabaseCursor CURSOR FOR
SELECT name FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','msdb','tempdb','model','distribution')
ORDER BY 1
OPEN DatabaseCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
WHILE @@FETCH_STATUS = 0
BEGIN
-- rebuild fulltext catalog
set @cmd = 'DECLARE CatalogCursor CURSOR FOR
SELECT t.name AS TableName, c.name AS FTCatalogName, s.name as schemaname
FROM ['+ @Database + '].sys.tables t JOIN ['+ @Database +'].sys.fulltext_indexes i
ON t.object_id = i.object_id
JOIN ['+ @Database + '].sys.fulltext_catalogs c
ON i.fulltext_catalog_id = c.fulltext_catalog_id
JOIN ['+ @Database + '].sys.schemas s ON t.schema_id = s.schema_id'
--PRINT @cmd
EXEC (@cmd)
OPEN CatalogCursor
FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmdB = 'USE ['+ @Database + ']; ALTER FULLTEXT CATALOG ' + @Catalog + ' REBUILD;'
--PRINT @cmdB
EXEC (@cmdB)
FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
END
CLOSE CatalogCursor
OPEN CatalogCursor
FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmdC = 'USE ['+ @Database + ']; ALTER FULLTEXT INDEX ON ['+ @Database + '].[' + @Schema + '].[' + @Table + '] START FULL POPULATION;'
--PRINT @cmdC
EXEC (@cmdC)
FETCH NEXT FROM CatalogCursor INTO @Table, @Catalog, @Schema
END
CLOSE CatalogCursor
DEALLOCATE CatalogCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor
END
У кого-нибудь есть метод, который не требует курсоров?