微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自动创建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)

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

原文地址:https://www.jb51.cc/mssql/83445.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐