我正在编写SQL Server部署脚本,这些脚本会在特定的SQL Server服务器/实例上自动创建SQL Server作业。我发现可以通过将脚本作业用作=> Create To来提取可用于自动创建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)
希望这将使您朝正确的方向前进。如果您需要更多帮助,请告诉我。