步骤之间的SQL Server代理作业传递参数?
我正在创建一些作业来备份数据库,然后压缩它们。我想一步备份数据库,下一步压缩文件,所以我想将文件名从第一步传递到第二步。有人知道我应该如何在步骤之间传递变量吗 我知道我可以将这一切都放在一个步骤中,或者我没有时间在文件名中完成这项工作,但我希望在备份文件名中保留日期和时间,并且我希望将这些步骤分开,以便更容易地了解备份失败时为什么会失败 如果将值保存到临时表是唯一的方法,我可以这样做,但我认为应该有更好的方法 我正在MS SQL 2005和2008上运行此功能步骤之间的SQL Server代理作业传递参数?,sql,database-backups,sql-server-agent,Sql,Database Backups,Sql Server Agent,我正在创建一些作业来备份数据库,然后压缩它们。我想一步备份数据库,下一步压缩文件,所以我想将文件名从第一步传递到第二步。有人知道我应该如何在步骤之间传递变量吗 我知道我可以将这一切都放在一个步骤中,或者我没有时间在文件名中完成这项工作,但我希望在备份文件名中保留日期和时间,并且我希望将这些步骤分开,以便更容易地了解备份失败时为什么会失败 如果将值保存到临时表是唯一的方法,我可以这样做,但我认为应该有更好的方法 我正在MS SQL 2005和2008上运行此功能 -- ##############
-- ################################################################################
-- ################################################################################
-- ## ##
-- ## Create a Backup job for each database. ##
-- ## ##
-- ################################################################################
-- ################################################################################
SET NOCOUNT ON
-- Path that all Backups will get saved to.
DECLARE @BackupPathName nvarchar(max)
--SET @BackupPathName = N'\\SERVER\FILES\Backups\'
SET @BackupPathName = N'D:\FILES\Backups\'
DECLARE @ServerName nvarchar(30)
--SET @ServerName = 'SERVER'
SET @ServerName = N'SERVER'
DECLARE @7z_path nvarchar(max)
SET @7z_path = N'D:\FILES'
DECLARE @7zAlgorithm nvarchar(max)
SET @7zAlgorithm = N'-t7z' -- better compression
--SET @7zAlgorithm = N'tbzip2' -- faster compression
DECLARE @CompressionLevel nvarchar(max)
--SET @CompressionLevel = N'-mx0' -- Dont compress
--SET @CompressionLevel = N'-mx1' -- Low
--SET @CompressionLevel = N'-mx3' -- Fast
SET @CompressionLevel = N'-mx5' -- Normal
--SET @CompressionLevel = N'-mx7' -- Maximum
--SET @CompressionLevel = N'-mx9' -- Ultra
-- Get a list of the databases, except for the ones listed in the where section of the query
DECLARE @AllDatabases TABLE(
ROW_NUM int,
DbName sysname)
INSERT INTO @AllDatabases (ROW_NUM, DbName)
SELECT ROW_NUMBER() OVER(ORDER BY [name]) AS ROW_NUM, [name] AS DbName
FROM sys.databases
WHERE [name] NOT IN (N'master', N'model', N'msdb', N'tempdb')
-- While loop to go through each database
DECLARE @MaxRowNum int
SET @MaxRownum = (SELECT MAX(ROW_NUM) FROM @AllDatabases)
DECLARE @Iter int
SET @Iter = (SELECT MIN(ROW_NUM) FROM @AllDatabases)
WHILE @Iter <= @MaxRownum
BEGIN
-- Name of the Database
DECLARE @DbName sysname
SET @DbName = NULL
SET @DbName = (SELECT TOP(1) DbName FROM @AllDatabases WHERE ROW_NUM = @Iter)
-- Name of the job to be created
DECLARE @JobName nvarchar(128)
SET @JobName = NULL
SET @JobName = 'Backup ' + @DbName + ' Database job'
-- Script to create the Job
DECLARE @CreateJob nvarchar(max)
SET @CreateJob = NULL
SET @CreateJob =
'USE msdb;
DECLARE @Job_Number uniqueidentifier
EXEC sp_add_job @job_name = N''' + @JobName + ''', @job_id = @Job_Number OUTPUT;
SELECT @Job_Number
'
-- Table to return the Job ID to
DECLARE @Job_ID_Table TABLE(
Job_ID uniqueidentifier)
-- Variable to hold the Job ID
DECLARE @Job_ID uniqueidentifier
SET @Job_ID = NULL
-- Create the Job
INSERT INTO @Job_ID_Table
EXEC sp_executesql @statement = @CreateJob
-- Get the ID Number for the Job
SET @Job_ID = (SELECT TOP(1) * FROM @Job_ID_Table)
-- ########################################
-- # Step 1: Backup the database. #
-- ########################################
-- Step Name
DECLARE @BackupDatabaseStepName sysname
SET @BackupDatabaseStepName = NULL
SET @BackupDatabaseStepName = 'Backup ' + @DbName
-- Create Step
DECLARE @BackupDatabaseStep nvarchar(max)
SET @BackupDatabaseStep = NULL
SET @BackupDatabaseStep =
'USE msdb;
EXEC sp_add_jobstep @job_id = N''' + CONVERT(nvarchar(max), @Job_ID) +''', @step_name = N''' + @BackupDatabaseStepName + ''', @subsystem = N''TSQL'', @command = N''
DECLARE @BackupFilePath nvarchar(max)
SET @BackupFilePath = ''''' + @BackupPathName + @DbName + ''''' + ''''.'''' +
/*Year */ convert(varchar(4), DATEPART(yyyy, GETDATE())) + ''''-'''' +
/*Month*/ right(''''00'''' + convert(varchar(2), DATEPART(mm, GETDATE())),2) + ''''-'''' +
/*Day */ right(''''00'''' + convert(varchar(2), DATEPART(dd, GETDATE())),2) + ''''-'''' +
/*Hour */ right(''''00'''' + convert(varchar(2), DATEPART(hh, GETDATE())),2) + ''''-'''' +
/*Min */ right(''''00'''' + convert(varchar(2), DATEPART(mi, GETDATE())),2) + ''''.BAK''''
DECLARE @BackupScript nvarchar(max)
SET @BackupScript = ''''BACKUP DATABASE ' + @DbName + ' TO DISK = '''''''''''' + @BackupFilePath + ''''''''''''''''
EXEC (@BackupScript) /* Have to execute this this way because BACKUP DATABASE doesnt allow variables. */
SELECT @BackupFilePath
'', @on_success_action = 3, @retry_attempts = 5, @retry_interval = 1
'
-- Add step to Job
EXEC sp_executesql @statement = @BackupDatabaseStep
-- ########################################
-- # Step 2: Zip the database. #
-- ########################################
-- Step Name
DECLARE @ZipDatabaseStepName sysname
SET @ZipDatabaseStepName = NULL
SET @ZipDatabaseStepName = 'Compress ' + @DbName
-- Create Step
DECLARE @ZipDatabaseStep nvarchar(max)
SET @ZipDatabaseStep = NULL
SET @ZipDatabaseStep =
'USE msdb;
EXEC sp_add_jobstep @job_id = N''' + CONVERT(nvarchar(max), @Job_ID) +''', @step_name = N''' + @ZipDatabaseStepName + ''', @subsystem = N''TSQL'', @command = N''
DECLARE @BackupFilePath nvarchar(max)
SET @BackupFilePath = ''''' + @BackupPathName + @DbName + ''''' + ''''.'''' +
/*Year */ convert(varchar(4), DATEPART(yyyy, GETDATE())) + ''''-'''' +
/*Month*/ right(''''00'''' + convert(varchar(2), DATEPART(mm, GETDATE())),2) + ''''-'''' +
/*Day */ right(''''00'''' + convert(varchar(2), DATEPART(dd, GETDATE())),2) + ''''-'''' +
/*Hour */ right(''''00'''' + convert(varchar(2), DATEPART(hh, GETDATE())),2) + ''''-'''' +
/*Min */ right(''''00'''' + convert(varchar(2), DATEPART(mi, GETDATE())),2) + ''''.BAK''''
DECLARE @ZipFilePath nvarchar(max)
SET @ZipFilePath = @BackupFilePath + ''''.7z''''
DECLARE @CompressionScript nvarchar(1000) /* xp_cmdshell wont accept a varchar with max length */
SET @CompressionScript = ''''' + @7z_path + '\7za a ' + @7zAlgorithm + ' ' + @CompressionLevel + ' ' + ''''' + @ZipFilePath + '''' '''' + @BackupFilePath + '''' ''''
EXEC xp_cmdshell @CompressionScript
'', @retry_attempts = 5, @retry_interval = 1
'
-- Add step to Job
EXEC sp_executesql @statement = @ZipDatabaseStep
-- Set Job Server
DECLARE @SetJobServer nvarchar(max)
SET @SetJobServer =
'USE msdb;
EXEC dbo.sp_add_jobserver @job_id = N''' + CONVERT(nvarchar(max), @Job_ID) + ''', @server_name = N''' + @ServerName + ''';
'
-- Set the Job server
EXEC sp_executesql @statement = @SetJobServer
SET @Iter = @Iter + 1
END
SET NOCOUNT OFF
从来没有找到更好的方法将值传递到服务器代理作业中,所以只能创建临时表,保持作业打开并启动其他作业 从未找到更好的方法将值传递到服务器代理作业中,因此只能创建临时表,保持作业打开并启动其他作业 也许你可以使用SSIS,因为我不想使用SSIS,因为我想在SQL代码中保留尽可能多的内容,我想这会使我更容易进入代码并对其进行自定义,然后重新部署。目前,我可能会尝试使用在每台服务器上的单独作业中创建的全局临时表,然后在该作业完成后将结果保存回主服务器上的永久表,以便通过电子邮件发送所有备份的最终结果。但在我看来,还是应该有一种方法可以将值传递到下一步?可能重复的可能您可以使用SSIS实现这一点我不想使用SSIS,因为我希望在SQL代码中保留尽可能多的内容,我认为这使我更容易进入代码并自定义它,然后重新部署它。目前,我可能会尝试使用在每台服务器上的单独作业中创建的全局临时表,然后在该作业完成后将结果保存回主服务器上的永久表,以便通过电子邮件发送所有备份的最终结果。但在我看来,还是应该有一种方法将值传递到下一步?可能是重复的