私はいくつかのシステム sproc の理解を深めるために取り組んでいますが、私が取り組んでいたこのスクリプトに非常に混乱しています。理解を深めるため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
「ループ」が期待どおりに機能しないのはなぜですか? 私は何が欠けていますか?