Sql-Server

在 SQLCMD 腳本中抑制非 ANSI 警告

  • April 5, 2017

我正在使用在 SQL Server 2014 中創建 SQL 代理作業的腳本。該作業的最後兩個步驟是“成功完成”和“失敗完成”。該腳本總是警告不存在的步驟。

警告:@on_fail_step_id 引用的步驟不存在。警告:@on_success_step_id 引用的步驟不存在。警告:@on_fail_step_id 引用的步驟不存在。

設置 ANSI_WARNINGS 關閉

我想它們對這些沒有影響,而不是 ANSI 警告。

有沒有辦法抑制這些?

Complete with Success 的高級選項卡 Complete with Failure 的高級選項卡

我能夠重現該問題。問題是第 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

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