Sql Server 2008 - Как запросить статус полнотекстовых каталогов во всех пользовательских базах данных? - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть несколько баз данных в экземпляре Sql Server 2008 R2. Некоторые из этих баз данных имеют полнотекстовую таблицу. Имя полнотекстовой таблицы одинаково для всех баз данных, но базы данных имеют разные имена и создаются по требованию (я никогда не знаю, какие базы данных существуют, а какие нет).

Дело в том, что мне нужно запросить все каталоги во всех базах данных, чтобы проверить, выполнено ли заполнение, но я не знаю, сколько у меня баз данных (конечно, я знаю, но они создаются по требованию, как я уже сказал) , Сценарий должен запросить все базы данных и проверить, выполняется ли заполнение в таблице (это имя, которое я знаю, потому что оно никогда не меняется, кроме имени базы данных, которая действительно изменяется)

Я видел много людей, использующих такие вещи, как:

sys.fulltext_catalogs

Но это не работает, если я, например, использую базу данных master.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 27 ноября 2012

Это дает вам полный список используемых каталогов.

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;
2 голосов
/ 17 сентября 2011

Редактировать: Вот более полный код с курсором, полный список баз данных (даже без каталогов) и правильное имя каталога:

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;
...