Sql server Sql Server维护计划任务和完成
我有一个这样的维护计划Sql server Sql Server维护计划任务和完成,sql-server,concurrency,ssis,maintenance-plan,Sql Server,Concurrency,Ssis,Maintenance Plan,我有一个这样的维护计划 Client 1 Import Data (Success) -> Process Data (Success) -> Post Process (Completion) -> Next Client Client 2 Import Data (Success) -> Process Data (Success) -> Post Process (Completion) -> Next Client Client N ... 导入数据
Client 1 Import Data (Success) -> Process Data (Success) -> Post Process (Completion) -> Next Client
Client 2 Import Data (Success) -> Process Data (Success) -> Post Process (Completion) -> Next Client
Client N ...
导入数据和流程数据正在调用作业,而后处理是执行Sql任务。
如果导入数据或流程数据失败,它将转到下一个客户端导入数据
导入数据和流程数据都是作业,其中包含使用内置SQL日志提供程序的SSIS包
我对现有配置的期望是:
客户端1导入数据运行:失败->客户端2导入数据|成功过程数据
流程数据运行:失败->客户端2导入数据|成功后处理
后处理运行:完成->成功或失败->下一个客户端导入数据
这不是我在日志中看到的。。。
我看到几个客户端导入数据SSIS日志条目,然后是几个后期处理日志条目,然后返回到客户端导入数据!Arg
我做错了什么?我不认为客户端1导入数据的成功部分会启动,直到它。。。好完成了!日志似乎表明了另一种情况,尽管
我真的需要这些任务是连续的,而不是并发的。这可能吗
谢谢 尝试在需要分组执行的任务周围放置一个序列容器。尝试在需要分组执行的任务周围放置一个序列容器。对于我来说,解决方法不是使用内置的execute SQL Server Agent作业任务,而是使用execute T-SQL语句任务并调用阻止直到完成 甜蜜的成功:-
CREATE PROCEDURE [dbo].[SQLJob_RunBlocking]
(
@JobName SYSNAME
)
AS
BEGIN
-- running a job returns before the job is complete
-- this procedure will run the job and loop until its status is complete
SET NOCOUNT ON;
DECLARE @JobStatus INT;
-- start job
EXECUTE msdb.dbo.sp_start_job @job_name = @JobName;
-- loop until status is complete
WHILE ISNULL(@JobStatus, 0) != 4 BEGIN
WAITFOR DELAY '00:00:01';
EXECUTE dbo.SQLJob_GetStatus @job_name = @JobName, @select_data = 0, @execution_status = @JobStatus OUTPUT;
END
END
而且
CREATE PROCEDURE [dbo].[SQLJob_GetStatus]
(
@job_name SYSNAME
,@select_data INT = 0
,@execution_status INT = NULL OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
-- http://www.siccolo.com/Articles/SQLScripts/how-to-create-sql-to-sql-job-execution-status.html
/*
Is the execution status for the jobs.
Value Description
0 Returns only those jobs that are not idle or suspended.
1 Executing.
2 Waiting for thread.
3 Between retries.
4 Idle.
5 Suspended.
7 Performing completion actions
*/
DECLARE @job_id UNIQUEIDENTIFIER
,@is_sysadmin INT
,@job_owner SYSNAME;
SELECT @job_id = job_id FROM msdb.dbo.sysjobs_view where name = @job_name;
SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0);
SELECT @job_owner = SUSER_SNAME();
CREATE TABLE #xp_results (
job_id UNIQUEIDENTIFIER NOT NULL,
last_run_date INT NOT NULL,
last_run_time INT NOT NULL,
next_run_date INT NOT NULL,
next_run_time INT NOT NULL,
next_run_schedule_id INT NOT NULL,
requested_to_run INT NOT NULL, -- BOOL
request_source INT NOT NULL,
request_source_id sysname COLLATE database_default NULL,
running INT NOT NULL, -- BOOL
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL
);
IF ((@@microsoftversion / 0x01000000) >= 8) -- SQL Server 8.0 or greater
INSERT INTO #xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner, @job_id;
ELSE
INSERT INTO #xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner;
--declare @execution_status int
SET @execution_status = (SELECT job_state FROM #xp_results);
DROP TABLE #xp_results;
IF @select_data = 1
SELECT @job_name AS 'job_name', @execution_status AS 'execution_status';
END
对我来说,解决方法不是使用内置的执行SQL Server代理作业任务,而是使用执行T-SQL语句任务并调用一个阻塞到完成的存储过程 甜蜜的成功:-
CREATE PROCEDURE [dbo].[SQLJob_RunBlocking]
(
@JobName SYSNAME
)
AS
BEGIN
-- running a job returns before the job is complete
-- this procedure will run the job and loop until its status is complete
SET NOCOUNT ON;
DECLARE @JobStatus INT;
-- start job
EXECUTE msdb.dbo.sp_start_job @job_name = @JobName;
-- loop until status is complete
WHILE ISNULL(@JobStatus, 0) != 4 BEGIN
WAITFOR DELAY '00:00:01';
EXECUTE dbo.SQLJob_GetStatus @job_name = @JobName, @select_data = 0, @execution_status = @JobStatus OUTPUT;
END
END
而且
CREATE PROCEDURE [dbo].[SQLJob_GetStatus]
(
@job_name SYSNAME
,@select_data INT = 0
,@execution_status INT = NULL OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
-- http://www.siccolo.com/Articles/SQLScripts/how-to-create-sql-to-sql-job-execution-status.html
/*
Is the execution status for the jobs.
Value Description
0 Returns only those jobs that are not idle or suspended.
1 Executing.
2 Waiting for thread.
3 Between retries.
4 Idle.
5 Suspended.
7 Performing completion actions
*/
DECLARE @job_id UNIQUEIDENTIFIER
,@is_sysadmin INT
,@job_owner SYSNAME;
SELECT @job_id = job_id FROM msdb.dbo.sysjobs_view where name = @job_name;
SELECT @is_sysadmin = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0);
SELECT @job_owner = SUSER_SNAME();
CREATE TABLE #xp_results (
job_id UNIQUEIDENTIFIER NOT NULL,
last_run_date INT NOT NULL,
last_run_time INT NOT NULL,
next_run_date INT NOT NULL,
next_run_time INT NOT NULL,
next_run_schedule_id INT NOT NULL,
requested_to_run INT NOT NULL, -- BOOL
request_source INT NOT NULL,
request_source_id sysname COLLATE database_default NULL,
running INT NOT NULL, -- BOOL
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL
);
IF ((@@microsoftversion / 0x01000000) >= 8) -- SQL Server 8.0 or greater
INSERT INTO #xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner, @job_id;
ELSE
INSERT INTO #xp_results
EXECUTE master.dbo.xp_sqlagent_enum_jobs @is_sysadmin, @job_owner;
--declare @execution_status int
SET @execution_status = (SELECT job_state FROM #xp_results);
DROP TABLE #xp_results;
IF @select_data = 1
SELECT @job_name AS 'job_name', @execution_status AS 'execution_status';
END