sql-server - 意外的 sp_MSForEachDB 行为

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

我正在努力加深对某些系统存储过程的理解,但我对我正在处理的这个脚本感到非常困惑。为了锻炼我对 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“循环”没有按预期工作?我错过了什么?

最佳答案

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

关于sql-server - 意外的 sp_MSForEachDB 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5567110/

相关文章:

c# - Microsoft 主数据服务 : How to get/set description of Model/Entity programmatically

sql-server - 归档大量旧数据会锁定我的数据库吗?

sql:删除 + 插入 vs 更新 + 插入

c# - 不使用第二个查询返回最后插入的 ID

c# - ado.net transaction.commit 抛出信号量异常

asp.net - 在时间紧迫的情况下添加更多硬件 v/s 重构代码

c# - 如何使用c# ASP.net返回sql查询结果消息

c# - 合并 gridview 行并消除重复项

java - 在eclipse中连接sql 2008 R2与Java

database - 如何设置 SQL Server Enterprise 进行分区