意外的sp_MSForEachDB行为

时间:2011-04-06 13:26:47

标签: sql-server sql-server-2008 sql-server-2008-r2 truncate sp-msforeachdb

我正在努力增强对某些系统sprocs的理解,我对我正在研究的这个脚本感到非常困惑。为了理解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“循环”无法按预期工作?我错过了什么?

1 个答案:

答案 0 :(得分:2)

您的查询看起来像是返回数据文件的逻辑名而不是日志文件? (FILEID = 1)