Sql-Server
在 SQLCMD 腳本中抑制非 ANSI 警告
我正在使用在 SQL Server 2014 中創建 SQL 代理作業的腳本。該作業的最後兩個步驟是“成功完成”和“失敗完成”。該腳本總是警告不存在的步驟。
警告:@on_fail_step_id 引用的步驟不存在。警告:@on_success_step_id 引用的步驟不存在。警告:@on_fail_step_id 引用的步驟不存在。
設置 ANSI_WARNINGS 關閉
我想它們對這些沒有影響,而不是 ANSI 警告。
有沒有辦法抑制這些?
我能夠重現該問題。問題是第 1 步是指尚未創建的步驟。以下程式碼將生成您遇到的相同錯誤。
USE [msdb] GO BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'test333', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'No description available.', @category_name=N'[Uncategorized (Local)]', @owner_login_name=N'domain\account', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'GetDate', @step_id=1, @cmdexec_success_code=0, @on_success_action=4, @on_success_step_id=2, @on_fail_action=4, @on_fail_step_id=3, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'select getdate()', @database_name=N'master', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'success', @step_id=2, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'Print ''i am success''', @database_name=N'master', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'failure', @step_id=3, @cmdexec_success_code=0, @on_success_action=2, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'print ''i am failure''', @database_name=N'master', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION EndSave: GO
我在第一步註釋掉了 4 行。添加了一個呼叫 sp_update_jobstep 的部分。此程式碼不會拋出您遇到的錯誤。我只是在這裡粘貼修改後的程式碼。
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'GetDate', @step_id=1, @cmdexec_success_code=0, --@on_success_action=4, --@on_success_step_id=2, --@on_fail_action=4, --@on_fail_step_id=3, ........ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
在創建最後一步的末尾和執行 sp_add_jobserver 之前添加它。
EXEC msdb.dbo.sp_update_jobstep @job_id=@jobid, @step_id=1 , @on_success_action=4, @on_success_step_id=2, @on_fail_action=4, @on_fail_step_id=3