我正在编写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)
希望这会让你朝着正确的方向前进.如果您需要更多帮助,请告诉我.