นี่คือสคริปต์ที่ฉันสร้างขึ้นโดยใช้เคอร์เซอร์เพื่อสร้างและเติมดัชนีแบบเต็มสำหรับตารางใด ๆ ที่มีหนึ่งสำหรับ MSSQL2008 สิ่งนี้ทำงานในสภาพแวดล้อมการผลิตโดยใช้ฐานข้อมูลที่ย้ายจากเซิร์ฟเวอร์ MSSQL 2000 ฉันปิดการติดตามการเปลี่ยนแปลงและเพียงแค่เรียกใช้ขั้นตอนการจัดเก็บนี้ผ่านทางตัวแทนของเซิร์ฟเวอร์ SQL หากคุณใช้งานด่วนคุณสามารถใช้สคริปต์ VBS เพื่อเรียกใช้งานผ่าน Task Scheduler
เป็นสิ่งสำคัญในสคริปต์ที่ต้องสร้างใหม่ก่อนทุกแคตตาล็อกก่อนที่จะพยายามเติมดัชนี
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
ใครบ้างมีวิธีที่ไม่ต้องใช้เคอร์เซอร์?