将 sysssislog executionid 链接到 SSIS 代理作业历史记录
Linking sysssislog executionid to SSIS Agent Job history
我有一个配置为登录到 SQL 服务器的 SSIS 包。配置包后,将在 MyDatabase > System Tables > dbo.sysssislog
下创建系统 Table
此 table 的架构与 identically named table held in msdb 匹配。
在此 table 中,每个包执行都有一个唯一的 executionid
,定义为:
uniqueidentifier
The GUID of the execution instance of the executable that generated the logging entry
每次 SSIS 包 运行 并保存在以下 system variable 时生成:System::ExecutionInstanceGUID
样本日志查询:
SELECT [event] ,
[source] ,
[executionid] ,
[starttime] ,
[endtime]
FROM MyDatabase.[dbo].[sysssislog]
WHERE [event] IN ( 'PackageEnd', 'PackageStart' )
ORDER BY id desc, starttime
产生:
event source starttime endtime executionid
PackageEnd Package 2017-04-10 11:12:01 2017-04-10 11:12:01 4EDBF979-5E99-44DB-AA08-839D5DCF3F2F
PackageStart Package 2017-04-10 11:12:01 2017-04-10 11:12:01 4EDBF979-5E99-44DB-AA08-839D5DCF3F2F
PackageEnd Package 2017-04-05 13:39:11 2017-04-05 13:39:11 9E212747-3CB7-44D8-8728-9E442082DB8B
PackageStart Package 2017-04-05 13:39:11 2017-04-05 13:39:11 9E212747-3CB7-44D8-8728-9E442082DB8B
在我的应用程序中,我使用各种 SQL Server Agent Job Stored Procedures 来检索 SSIS 作业信息和历史记录。例如:
EXEC msdb.dbo.sp_help_jobhistory
@job_name = N'MyJobName',
@step_id = null
GO
生成(列摘要,1 次执行 = 3 行):
job_id job_name run_date run_time run_duration
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170410 111145 16
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170410 111200 1
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170410 111145 15
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170405 133855 16
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170405 133910 1
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170405 133855 15
我正在我的应用程序中构建一个 ETL 管理页面,该页面显示 SSIS 作业历史记录和日志摘要,但我找不到 link 日志的方法,基于唯一的 executionid
, 到从各种代理作业系统存储过程返回的作业历史记录。
有没有办法link executionid
从 sysssislog
到针对代理作业执行历史保存的信息?我能想到的最好办法是使用 date/time 匹配来识别时间上最接近代理作业统计信息的日志。
我研究过使用脚本任务和触发自定义事件来将 System::ExecutionInstanceGUID
记录到代理作业历史记录中,但我无法使用脚本任务,因为它在部署到客户时无法使用SQL 服务器的更高版本。
请注意,任何解决方案都需要与 2008R2 兼容。
我最终得到了以下解决方案,它不是最漂亮和性能最好的,但它满足了我的要求。我想要我的 ssis 包的最后 n 次执行,这是由 2 个参数指定的。我将此代码保存在我的应用程序调用的存储过程中:
DECLARE @packageName NVARCHAR(250) = 'MySqlServerAgentJobName',
@rowsToTake INT = 15;
WITH cte
AS (SELECT TOP 15 msdb.dbo.agent_datetime(h.run_date, h.run_time) AS LastRunDate,
h.run_status RunStatus,
h.run_duration RunDurationSeconds,
(
SELECT TOP 1 executionid
FROM [dbo].[sysssislog]
WHERE starttime >= msdb.dbo.agent_datetime(h.run_date, h.run_time)
AND [event] = ('PackageStart')
) ExecutionId
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.name = @packageName AND h.step_name = '(Job outcome)'
ORDER BY LastRunDate DESC
)
SELECT cte.LastRunDate,
cte.RunStatus,
cte.RunDurationSeconds,
cte.ExecutionId
FROM cte
它使用内置函数从代理工作字段解析有效的 datetime
:
msdb.dbo.agent_datetime(h.run_date, h.run_time) AS LastRunDate
它从 sysssislogs
table 中检索 top 1 execution id
,在 [event] = ('PackageStart')
上过滤,每次执行作业时都存在 starttime
必须是 >=
代理作业记录的 LastRunDate
。
它产生这样的结果:
LastRunDate RunStatus RunDurationSecs ExecutionId
2017-07-12 12:32:18.000 1 210 99A8A715-890D-4115-975F-AC3DA660770D
2017-07-12 12:00:01.000 1 215 D152C1C6-530F-45D6-B962-41784EC7D9E5
2017-07-12 11:22:13.000 1 204 BBAC73C1-1600-477E-AFC9-1F66D7CFD07A
2017-07-12 10:25:44.000 1 213 A4C69B3C-462B-4000-B2BD-8C9EB47230DA
2017-07-12 10:16:19.000 1 230 3D4D8572-E4CC-4B70-875A-C5D3B513A480
2017-07-12 07:33:21.000 1 244 D8283955-B3EB-4E6D-BFDC-8D7C0D954574
2017-07-11 12:00:00.000 1 211 553FC580-54B2-490C-BB1D-6B1F9BB35C84
2017-07-10 16:21:16.000 1 212 B9A78077-A04C-49AC-A4C6-EF6AB636D862
2017-07-10 16:13:18.000 1 255 DFC853D8-67F5-43CE-B8A4-00B846425C6B
2017-07-10 14:04:00.000 1 217 8C6861B1-6CDE-44FD-8606-18F24F339C05
2017-07-10 13:58:27.000 1 224 5A05011C-9F14-4098-B579-0E75C1E76BDB
2017-07-10 13:53:14.000 1 231 9A2B52FB-2BD4-4FAA-A4A0-40AC48A41326
2017-07-10 13:42:06.000 1 210 9BDBB290-1C84-49ED-87E6-97522DB4AB81
2017-07-10 12:06:44.000 1 215 F4D0A847-F7E4-4F2B-B328-58C387D2C50E
2017-07-10 12:00:01.000 1 241 5EC52369-9832-4718-AF92-2C502D454A41
我有一个配置为登录到 SQL 服务器的 SSIS 包。配置包后,将在 MyDatabase > System Tables > dbo.sysssislog
此 table 的架构与 identically named table held in msdb 匹配。
在此 table 中,每个包执行都有一个唯一的 executionid
,定义为:
uniqueidentifier
The GUID of the execution instance of the executable that generated the logging entry
每次 SSIS 包 运行 并保存在以下 system variable 时生成:System::ExecutionInstanceGUID
样本日志查询:
SELECT [event] ,
[source] ,
[executionid] ,
[starttime] ,
[endtime]
FROM MyDatabase.[dbo].[sysssislog]
WHERE [event] IN ( 'PackageEnd', 'PackageStart' )
ORDER BY id desc, starttime
产生:
event source starttime endtime executionid
PackageEnd Package 2017-04-10 11:12:01 2017-04-10 11:12:01 4EDBF979-5E99-44DB-AA08-839D5DCF3F2F
PackageStart Package 2017-04-10 11:12:01 2017-04-10 11:12:01 4EDBF979-5E99-44DB-AA08-839D5DCF3F2F
PackageEnd Package 2017-04-05 13:39:11 2017-04-05 13:39:11 9E212747-3CB7-44D8-8728-9E442082DB8B
PackageStart Package 2017-04-05 13:39:11 2017-04-05 13:39:11 9E212747-3CB7-44D8-8728-9E442082DB8B
在我的应用程序中,我使用各种 SQL Server Agent Job Stored Procedures 来检索 SSIS 作业信息和历史记录。例如:
EXEC msdb.dbo.sp_help_jobhistory
@job_name = N'MyJobName',
@step_id = null
GO
生成(列摘要,1 次执行 = 3 行):
job_id job_name run_date run_time run_duration
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170410 111145 16
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170410 111200 1
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170410 111145 15
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170405 133855 16
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170405 133910 1
52916CFE-A652-4AAA-A052-738E4B349966 MyJobName 20170405 133855 15
我正在我的应用程序中构建一个 ETL 管理页面,该页面显示 SSIS 作业历史记录和日志摘要,但我找不到 link 日志的方法,基于唯一的 executionid
, 到从各种代理作业系统存储过程返回的作业历史记录。
有没有办法link executionid
从 sysssislog
到针对代理作业执行历史保存的信息?我能想到的最好办法是使用 date/time 匹配来识别时间上最接近代理作业统计信息的日志。
我研究过使用脚本任务和触发自定义事件来将 System::ExecutionInstanceGUID
记录到代理作业历史记录中,但我无法使用脚本任务,因为它在部署到客户时无法使用SQL 服务器的更高版本。
请注意,任何解决方案都需要与 2008R2 兼容。
我最终得到了以下解决方案,它不是最漂亮和性能最好的,但它满足了我的要求。我想要我的 ssis 包的最后 n 次执行,这是由 2 个参数指定的。我将此代码保存在我的应用程序调用的存储过程中:
DECLARE @packageName NVARCHAR(250) = 'MySqlServerAgentJobName',
@rowsToTake INT = 15;
WITH cte
AS (SELECT TOP 15 msdb.dbo.agent_datetime(h.run_date, h.run_time) AS LastRunDate,
h.run_status RunStatus,
h.run_duration RunDurationSeconds,
(
SELECT TOP 1 executionid
FROM [dbo].[sysssislog]
WHERE starttime >= msdb.dbo.agent_datetime(h.run_date, h.run_time)
AND [event] = ('PackageStart')
) ExecutionId
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE j.name = @packageName AND h.step_name = '(Job outcome)'
ORDER BY LastRunDate DESC
)
SELECT cte.LastRunDate,
cte.RunStatus,
cte.RunDurationSeconds,
cte.ExecutionId
FROM cte
它使用内置函数从代理工作字段解析有效的 datetime
:
msdb.dbo.agent_datetime(h.run_date, h.run_time) AS LastRunDate
它从 sysssislogs
table 中检索 top 1 execution id
,在 [event] = ('PackageStart')
上过滤,每次执行作业时都存在 starttime
必须是 >=
代理作业记录的 LastRunDate
。
它产生这样的结果:
LastRunDate RunStatus RunDurationSecs ExecutionId
2017-07-12 12:32:18.000 1 210 99A8A715-890D-4115-975F-AC3DA660770D
2017-07-12 12:00:01.000 1 215 D152C1C6-530F-45D6-B962-41784EC7D9E5
2017-07-12 11:22:13.000 1 204 BBAC73C1-1600-477E-AFC9-1F66D7CFD07A
2017-07-12 10:25:44.000 1 213 A4C69B3C-462B-4000-B2BD-8C9EB47230DA
2017-07-12 10:16:19.000 1 230 3D4D8572-E4CC-4B70-875A-C5D3B513A480
2017-07-12 07:33:21.000 1 244 D8283955-B3EB-4E6D-BFDC-8D7C0D954574
2017-07-11 12:00:00.000 1 211 553FC580-54B2-490C-BB1D-6B1F9BB35C84
2017-07-10 16:21:16.000 1 212 B9A78077-A04C-49AC-A4C6-EF6AB636D862
2017-07-10 16:13:18.000 1 255 DFC853D8-67F5-43CE-B8A4-00B846425C6B
2017-07-10 14:04:00.000 1 217 8C6861B1-6CDE-44FD-8606-18F24F339C05
2017-07-10 13:58:27.000 1 224 5A05011C-9F14-4098-B579-0E75C1E76BDB
2017-07-10 13:53:14.000 1 231 9A2B52FB-2BD4-4FAA-A4A0-40AC48A41326
2017-07-10 13:42:06.000 1 210 9BDBB290-1C84-49ED-87E6-97522DB4AB81
2017-07-10 12:06:44.000 1 215 F4D0A847-F7E4-4F2B-B328-58C387D2C50E
2017-07-10 12:00:01.000 1 241 5EC52369-9832-4718-AF92-2C502D454A41