我在Sql Server 2008 R2实例中有几个数据库。其中一些数据库具有启用全文的表。全文表的名称对于所有数据库都是相同的,但数据库具有不同的名称,并且是按需创建的(我从不知道存在哪些数据库,哪些数据库不存在)。
问题是:我需要查询所有数据库中的所有目录以检查是否已完成填充,但我不知道我有多少个数据库(当然我知道,但我们按照我的说法按需创建) 。该脚本必须查询所有数据库并检查是否在表中完成填充(我知道这个名称,因为除了确实发生更改的数据库名称之外它永远不会更改)
我见过很多人使用的东西:
sys.fulltext_catalogs
但是,如果我使用master数据库,它就不起作用。
有什么想法吗?
答案 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;