自动创建SQL Server作业

我正在编写sql Server部署脚本,它在特定的sql Server服务器/实例上自动创建sql Server作业.我发现我可以通过使用脚本作业as =>来提取可以用于自动创建sql Server作业的sql语句.创建到.

我的困惑是,我发现数据库名称和所有者帐户名称是在生成sql脚本中硬编码的.当我使用sqlcmd在另一台计算机上执行sql脚本来执行部署时,数据库名称和所有者帐户名称可能不同,所以我需要一种方法数据库名称和所有者帐户名称传递给sql Server作业创建脚本和让脚本使用提供的数据库名称和所有者帐户名称(硬编码的除外).

任何想法如何做到这一点?

解决方法

您需要动态创建作业脚本然后执行它.
您可以尝试类似以下内容或将其更改为存储过程,其中包含作业所有者和数据库名称的输入参数.
DECLARE @JobName VARCHAR(20)  --Job Name
DECLARE @Owner VARCHAR(200)   --Job Owner
DECLARE @dbname VARCHAR(200)  --Database Name
DECLARE @JobCode VARCHAR(4000) --Create Statement for Job
SET @JobName = 'Test2'
SET @Owner = 'BrianD'
SET @dbname = 'master'
SET @JobCode = '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''' + @JobName + ''',@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''' + @Owner + ''',@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''Version and Prod Level'',@step_id=1,@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''select SERVERPROPERTY(''''productversion''''),SERVERPROPERTY(''''productlevel'''')'',@database_name=N''' + @dbname + ''',@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'
Exec (@JobCode)

希望这会让你朝着正确的方向前进.如果您需要更多帮助,请告诉我.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 &#39;EastRiver&#39; 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...