我写这在特定的SQL Server服务器/实例自动创建SQL Server作业SQL Server部署脚本。 我发现,我可以提取可用于通过使用脚本工作作为=>创建自动创建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)
希望这将让你在正确的方向前进。 如果您需要更多的帮助,让我知道。
从BrainD使用的例子,我想指出的是,他使用的变量的想法是蛮好的,但是,它们传递给使用dymanic SQL肯定的存储过程是不正确的方法。 更确切地,使用的存储过程的参数,以直接直接传递的变量需要它们的地方。
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'
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= @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= @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=@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
Futher以上白里安的回答,您可以定义变量(其实更像是预处理宏不是变量)在sqlcmd水平; 这些被封闭在与一家领先的$符号括号:
SET @JobName = '$(JobName)'
SET @Owner = '$(Owner)'
这使您可以通过在命令行上的信息与-v开关SQLCMD:
sqlcmd -... -i create_jobs.sql -v JobName=Job1 -v Owner=BrianD
我今天在同样的问题来了,我该怎么处理就这么简单执行以下操作
创建一个存储过程与参数@serverName nvarchar的创建工作(128)
Create Proc CreateAJob(@serverName nvarchar(128))
现在很容易,你可以使用以下获得服务器名
Declare @serverName nvarchar(128) SELECT @servername=@@SERVERNAME
执行存储过程来创建作业
EXEC CreateJob @serverName
这就对了。
我使用的Visual Studio数据库项目,我做了步骤2和3的int部署后脚本
我甚至得到了更好......创建一个存储过程没有参数和内部存储的过程中做到:
Declare @serverName nvarchar(128)
SELECT @servername=@@SERVERNAME
然后分配给@servername作为sp_add_jobserver下面的服务器名称参数:
msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name =@serverName
为了创建存储过程创建一个SQL作业,首先创建使用SQL Management Studio中,然后用鼠标右键单击作业并做删除并创建它....