Sql-Server

一次性將 SQL 代理輸出添加到所有代理作業的文本文件

  • April 4, 2017

作為最佳實踐,我正在嘗試安排所有 SQL 代理作業應將輸出記錄到文本文件的活動。

手動我可以為單個工作執行此操作。但是我正在尋找一種更好的方法,無論是通過腳本還是任何好的方法,我都可以對每台伺服器大約 80-90 個作業的多個作業進行此更改。

此外,我必須在 QA、UAT 和 prod 中執行此操作,涵蓋 100 多台伺服器。

請分享您的經驗或任何有用的連結如何以最佳方式實現這一點,因為將生成輸出的日誌文件的路徑應該在伺服器/作業之間是通用的。

msdb 數據庫包含一個儲存過程,允許以多種方式修改作業步驟,包括僅修改輸出屬性的能力。

以下程式碼將輸出修改所有未指定“輸出文件”的作業步驟所需的命令,以便將作業步驟輸出寫入C:\temp\job_name_here.txt. 每次作業步驟執行時,輸出都會被覆蓋。

USE msdb;
DECLARE @OutputPath nvarchar(260);
DECLARE @cmd nvarchar(max);
SET @OutputPath = N'C:\temp';
DECLARE @msg nvarchar(1000);
SET @msg = N'
/*
flags: 
   0 - overwrite output file
   2 - append to output file
   4 - Write T-SQL output to step history in MSDB
   8 - Write log to table (overwrite existing)
   16 - Write log to table (append)
*/

';
PRINT @msg;
DECLARE cur CURSOR LOCAL FORWARD_ONLY LOCAL
FOR
SELECT N'EXEC msdb.dbo.sp_update_jobstep @job_id = N''{' + CONVERT(varchar(50), (sj.job_id)) + N'}''
   , @step_id = ' + CONVERT(nvarchar(30), sjs.step_id) + '
   , @output_file_name = N''' + @OutputPath + N'\' + sj.name + N'_Step_' + CONVERT(nvarchar(10), sjs.step_id) + N'.txt''
   , @flags = 0;

'
FROM dbo.sysjobs sj
   INNER JOIN dbo.sysjobsteps sjs ON sj.job_id = sjs.job_id
WHERE sjs.output_file_name IS NULL OR sjs.output_file_name = ''
ORDER BY sj.name
   , sjs.step_id;
OPEN cur;
FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
   IF LEN(@cmd)>4000 
   BEGIN
       SET @msg = 'Output of the next command is truncated.';
       RAISERROR (@msg, 14, 1);
   END
   PRINT @cmd;
   --EXEC sys.sp_executesql @cmd; --uncomment this line to actually run the command
   FETCH NEXT FROM cur INTO @cmd;
END
CLOSE cur;
DEALLOCATE cur;

您可以通過使用“已註冊伺服器”功能在 SSMS 中創建本地伺服器組,將所需的伺服器添加到該組,然後對該組執行查詢來針對多個伺服器執行此操作。

引用自:https://dba.stackexchange.com/questions/168971