Sql Server 2008 - 如何在所有用户数据库中查询全文目录的状态?

时间:2011-09-16 20:14:46

标签: sql sql-server sql-server-2008 full-text-search

我在Sql Server 2008 R2实例中有几个数据库。其中一些数据库具有启用全文的表。全文表的名称对于所有数据库都是相同的,但数据库具有不同的名称,并且是按需创建的(我从不知道存在哪些数据库,哪些数据库不存在)。

问题是:我需要查询所有数据库中的所有目录以检查是否已完成填充,但我不知道我有多少个数据库(当然我知道,但我们按照我的说法按需创建) 。该脚本必须查询所有数据库并检查是否在表中完成填充(我知道这个名称,因为除了确实发生更改的数据库名称之外它永远不会更改)

我见过很多人使用的东西:

sys.fulltext_catalogs

但是,如果我使用master数据库,它就不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

编辑:这里有更完整的代码,包含游标,完整的数据库列表(甚至没有目录的数据库)和正确的目录视图名称:

SET NOCOUNT ON;

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += ' UNION ALL 
    SELECT [name] = ''' + QUOTENAME(name) + ''', 
    catalog_name = name COLLATE Latin1_General_CI_AI,
    is_importing
  FROM ' + QUOTENAME(name) + '.sys.fulltext_catalogs'
  FROM sys.databases WHERE database_id > 4;

SET @sql = 'SELECT [database] = d.name, 
    s.catalog_name,
    s.is_importing
FROM sys.databases AS d 
LEFT OUTER JOIN (' + STUFF(@sql, 1, 10, '') + ') AS s 
ON QUOTENAME(d.name) = s.name
WHERE d.database_id > 4;';

CREATE TABLE #temp(db SYSNAME, catalog_name NVARCHAR(255), is_importing BIT);

INSERT #temp EXEC sp_executesql @sql;

DECLARE @db SYSNAME, @catalog_name NVARCHAR(255), @is_importing BIT;

DECLARE c CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR SELECT db, catalog_name, is_importing FROM #temp;

OPEN c;

FETCH NEXT FROM c INTO @db, @catalog_name, @is_importing;

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @catalog_name IS NULL
    BEGIN
        PRINT 'No catalogs for ' + @db;
    END
    ELSE
    BEGIN
        IF @is_importing = 1
        BEGIN
            PRINT 'Do something to ' + @db 
                + '(importing)';
        END
        ELSE
        BEGIN
            PRINT @db + ' is not importing.';
        END
    END
    FETCH NEXT FROM c INTO @db, @catalog_name, @is_importing;
END

CLOSE c;
DEALLOCATE c;

DROP TABLE #temp;

答案 1 :(得分:2)

这将为您提供已使用目录的完整列表。

CREATE TABLE #info (
  databasename VARCHAR(128)
, [Fulltext Catalog Name] VARCHAR(128));

SET NOCOUNT ON;
INSERT INTO #info

EXEC sp_MSforeachdb 'use ? 
SELECT ''?''
     , name 
FROM sys.fulltext_catalogs;'

SELECT * FROM #info 


-- get rid of temp table 
DROP TABLE #info;