Sql-Server
一次性將 SQL 代理輸出添加到所有代理作業的文本文件
作為最佳實踐,我正在嘗試安排所有 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 中創建本地伺服器組,將所需的伺服器添加到該組,然後對該組執行查詢來針對多個伺服器執行此操作。