2016-12-02 11 views
2

SQL Serverエージェントでsp_executesqlからコマンドを実行しています。このコマンドからメッセージをキャプチャするにはどのようにしてテーブルに記録できるのですか?sp_executesql中に出力されたメッセージの取得

特に、データベースログを切り捨てようとしていますが、これが成功したかどうかを確認したいと考えています。私はエージェントSPのコードスニペットを追加してい:

IF (@truncate = 1) 
BEGIN 
    SET @msg = 'Truncating log ''' + @description + ''' for the ''' + @db + ''' database' 
    EXEC _LogInsert 'Information', '_Loop', 'Status', @msg 

    --PRINT 'Attempting to truncate the log file' 
    SET @sql = N'USE [' + @db + ']' + 

'DECLARE @LogFile varchar(128)' + 

'SELECT TOP 1 @LogFile = [Name] ' + 
'FROM sys.database_files ' + 
'WHERE ([Type_Desc] = ''LOG'')' + 

'DBCC SHRINKFILE(@LogFile, EMPTYFILE)' + 
'DBCC SHRINKFILE(@LogFile, 10) WITH NO_INFOMSGS' 
    --PRINT 'truncation attempt finished' 
EXEC sp_executesql @sql 

    -- Capture messages from SP 
    -- SET @msg = 'Truncating log msg ''' + @resmsg + ''' for the ''' + @db + ''' database' 
    -- EXEC _LogInsert 'Information', '_Loop', 'Status', @msg 


END 
+0

すべてのメッセージを簡単に取り込むことはできません。ただし、ほとんどの例外をキャッチして、それらに関連付けられたメッセージを記録することができます。 – RBarryYoung

答えて

0

あなたが仕事としてこれを実行する場合は、あなたがdbo.sysjobhistoryから(少なくともDBCC出力、またはPRINT)に必要なデータを取ることができます:

SELECT jh.[run_date], 
     jh.[step_name], 
     jh.[message] 
FROM msdb.dbo.sysjobhistory jh 
INNER JOIN msdb.dbo.sysjobs j 
    ON j.[name] = 'job_name' and j.job_id = jh.job_id 

また、WITH NO_INFOMSGSに注意してください - これはすべての情報メッセージを抑制します。

+0

ありがとう、それは動作するようです。 – aggaton

関連する問題