我有多个SSIS集成包记录到数据库。他们都写信给表sysssislog。
我希望存储过程能够返回上次运行所选包的成功。
如何识别sysssislog中的包? executionid字段似乎有效,但似乎它在同一个包的大多数运行中改变了值(有时它保持不变)。有没有办法知道日志条目来自哪个包?
sysssislog的结构供参考:
CREATE TABLE [dbo].[sysssislog](
[id] [int] IDENTITY(1,1) NOT NULL,
[event] [sysname] NOT NULL,
[computer] [nvarchar](128) NOT NULL,
[operator] [nvarchar](128) NOT NULL,
[source] [nvarchar](1024) NOT NULL,
[sourceid] [uniqueidentifier] NOT NULL,
[executionid] [uniqueidentifier] NOT NULL,
[starttime] [datetime] NOT NULL,
[endtime] [datetime] NOT NULL,
[datacode] [int] NOT NULL,
[databytes] [image] NULL,
[message] [nvarchar](2048) NOT NULL,
答案 0 :(得分:2)
这是一个很好的视图候选者,可以查看SSIS中所有软件包的执行历史记录,您还可以看到软件包在几分钟内运行了多长时间:
select
source [PackageName], s.executionid
, min(s.starttime) StartTime
, max(s.endtime) EndTime
, (cast(max(s.endtime) as float) - cast(min(s.starttime) as float))*24*60 DurationInMinutes
from dbo.sysssislog as s
where event in ('PackageStart', 'PackageEnd')
--and source = 'foobar'
group by s.source, s.executionid
order by max(s.endtime) desc
答案 1 :(得分:1)
来源nvarchar
包中的可执行文件的名称,用于生成日志记录条目。
sourceid uniqueidentifier
生成日志记录条目的包中的可执行文件的GUID。
答案 2 :(得分:1)
列“sourceid”与您的事件的SSIS包GUID相同
如上所述 - executionid是run的特定实例的guid。
您可能希望启用“OnError”事件处理程序,以便生成未失败的程序包。
要生成报告,您可以执行以下操作:
在id = sourceid上加入msdb。[dbo]。[sysdtspackages]和dbo.sysssislog表。失败的软件包将在sysssislog表中具有OnError条目,您可以从中推断状态。
- 请标记这是否回答了您的问题
答案 3 :(得分:1)
与原始海报一样,我希望在浏览SSIS日志时在我的所有源名称前面看到我的包的名称。在阅读William的回复时,我意识到可以利用ExecutionID来做到这一点,至少在使用SQL Server的SSIS日志提供程序时。
如果您使用的是SQL Server 2008,并且您的SSIS日志记录表使用标准名称“sysssislog”,请尝试以下查询:
SELECT s1.id, s1.operator, s1.event, s2.source package_name, s1.source,
CONVERT(varchar, s1.starttime, 120) AS starttime, s1.message, s1.datacode
FROM dbo.sysssislog AS s1 LEFT OUTER JOIN
dbo.sysssislog AS s2 ON s1.executionid = s2.executionid
WHERE s2.event = 'PackageStart'
ORDER BY s1.id
注意:
我希望有所帮助。
答案 4 :(得分:0)
事件为“Package Start”的源ID列标识包名称。执行ID绑定到包运行的该实例的所有相关行。
通过打开包并查看包级别属性中的ID字段,可以将源ID绑定到您的包的开发。此GUID与日志中的包级别源ID列相匹配。包中的每个对象也都有自己的GUID,这些可以在日志中看到。
答案 5 :(得分:0)
如果要在运行项目期间监视执行情况,则必须使用更复杂的查询,例如:
SELECT MIN(A.ID) AS ID,
A.Source
, MIN(A.StartTime) AS StartTime
, case when MAX(B.endtime) IS NULL then null else round((cast(MAX(B.endtime) as float) - cast(MIN(A.starttime) as float))*24*60*60, 0) end AS Seconds
, C.Message
FROM (
SELECT ID, Source, StartTime, ExecutionID
FROM SysSSiSLog
WHERE Event = 'PackageStart'
) A
LEFT OUTER JOIN (
SELECT Source, EndTime, ExecutionID
FROM SysSSiSLog
WHERE Event = 'PackageEnd'
) B
ON A.Source = B.Source AND A.ExecutionID = B.ExecutionID
LEFT OUTER JOIN (
SELECT distinct Source, EndTime, ExecutionID, Message
FROM SysSSiSLog
WHERE Event = 'OnError'
) C
ON A.Source = C.Source AND A.ExecutionID = C.ExecutionID
WHERE A.ID >= (SELECT MAX(ID) FROM SysSSiSLog WHERE Source = 'Main' AND Event = 'PackageStart')
GROUP BY A.Source, A.ExecutionID, C.Message
ORDER BY min(A.ID) Asc