我创建了以下查询,以列出服务器上所有数据库的DBCC时间戳。有更好的方法吗?
IF OBJECT_ID(N'tempdb..#Results') IS NOT NULL
BEGIN
DROP TABLE #Results
END
CREATE TABLE #Results (ParentObject varchar(100), Object varchar(100), Field varchar(100), Value varchar(100))
GO
INSERT INTO #Results
EXEC sp_msForEachdb @command1 = 'DBCC DBINFO (''?'') WITH TABLERESULTS'
ALTER TABLE #Results ADD ID INT IDENTITY(1, 1)
GO -- required here
SELECT r.Value as [Database], r2.Value as CheckDB_LastKnownGood
FROM #Results r
INNER JOIN #Results r2
ON r2.ID = (SELECT MIN(ID) FROM #Results WHERE Field = 'dbi_dbccLastKnownGood' AND ID > r.ID)
WHERE r.Field = 'dbi_dbname'
ORDER BY r.Value发布于 2017-03-23 13:34:56
我将使用来自dbatools模块的PowerShell命令,这将使您能够一次性检查所有服务器。
下面是命令的示例输出

你可以得到这样的详细信息

检查一堆像这样的服务器

它也很快。在我拥有125个数据库的10台服务器的实验室中,它在5.3秒内完成
您可以在https://dbatools.io上阅读更多关于dbatools的内容。
发布于 2016-03-29 16:28:45
您可以使用游标,而不是使用sp_msForEachdb (正如亚伦描述的那样有问题)。
IF OBJECT_ID(N'tempdb..#Results') IS NOT NULL
BEGIN
DROP TABLE #Results;
END
CREATE TABLE #Results
(
DatabaseName SYSNAME NULL
, IsOnline BIT NULL
, ParentObject varchar(100) NULL
, [Object] varchar(100) NULL
, [Field] varchar(100) NULL
, [Value] varchar(100) NULL
);
DECLARE @cmd NVARCHAR(MAX);
DECLARE @dbName SYSNAME;
DECLARE @IsOnline BIT;
DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC
FOR
SELECT DBCCCommand = 'DBCC DBINFO(''' + d.name + ''') WITH TABLERESULTS;'
, DatabaseName = d.name
, IsOnline = CONVERT(BIT,
CASE WHEN d.state_desc = 'ONLINE' THEN 1 ELSE 0 END
)
FROM sys.databases d
ORDER BY d.name;
OPEN cur;
FETCH NEXT FROM cur INTO @cmd, @dbName, @IsOnline;
WHILE @@FETCH_STATUS = 0
BEGIN
RAISERROR (@dbName, 0, 1) WITH NOWAIT;
IF @IsOnline = 1
BEGIN
INSERT INTO #Results (ParentObject, [Object], [Field], [Value])
EXEC sp_executesql @cmd;
UPDATE #Results
SET DatabaseName = @dbName
, IsOnline = @IsOnline
WHERE DatabaseName IS NULL;
END
ELSE
BEGIN
INSERT INTO #Results (DatabaseName, IsOnline)
VALUES (@dbName, @IsOnline)
END
FETCH NEXT FROM cur INTO @cmd, @dbName, @IsOnline;
END
CLOSE cur;
DEALLOCATE cur;
SELECT r.DatabaseName
, LastKnownGoodDate = CONVERT(DATETIME, r.value, 120)
, r.IsOnline
FROM #Results r
WHERE r.field = 'dbi_dbccLastKnownGood'
OR r.field IS NULL;此输出具有数据库名和DBINFO输出中的LastKnownGood列作为DATETIME变量。未“联机”的数据库包括在输出中,LastKnownGoodDBCC列设置为NULL。
在我上面的例子中创建的游标是一个本地的、仅向前的、静态的游标,它非常高效。本地表示游标的范围仅限于我们的会话,这显然不是一个问题( sp_msForEachdb使用的是一个全局游标,设置起来非常昂贵)。前进选项表示我们不打算通过游标向后滚动,并允许Server使用前向只读游标语义。静态选项迫使Server将游标结果具体化到tempdb中的临时表中,并从那里读取每一行。声明游标上的MSDN页面拥有关于游标选项的优秀细节,非常值得阅读和理解。
https://dba.stackexchange.com/questions/133687
复制相似问题