我正在努力提高我对一些系统存储过程的理解,但我对我正在处理的这个脚本感到非常困惑。为了锻炼我的理解,sp_MSForEachDB
我决定编写一个脚本来截断服务器上所有数据库的日志。因此,我想出了以下脚本:
sp_MSForEachDb 'IF LOWER(rtrim(''?'')) NOT IN ('''', ''master'', ''tempdb'', ''tempdev'', ''model'', ''msdb'')
BEGIN
declare @LogFile nvarchar(max)
USE [?]
SELECT @LogFile = sys.sysaltfiles.name FROM sys.sysdatabases
INNER JOIN sys.sysaltfiles ON sys.sysdatabases.dbid = sys.sysaltfiles.dbid
WHERE (sys.sysaltfiles.fileid = 1) AND (sys.sysdatabases.name = ''?'')
print ''DB: [?], Log: '' + @LogFile
CHECKPOINT
DBCC SHRINKFILE (@LogFile, 1)
END'
事实证明,这只是有时会成功截断数据库的日志。在数据库上它失败(没有错误消息,只是给我留下一个未截断的日志文件),它始终/可重复地失败。
然而,在 print 语句中,它打印的正是我期望它打印的内容。但是,如果我手动为每个数据库键入此脚本的功能部分:
USE [Seed]
CHECKPOINT
DBCC SHRINKFILE('Seedlog', 1)
它在 100% 的时间内有效。
为什么我的sp_MSForEachDB
“循环”没有按预期工作?我错过了什么?