我有一台web服务器(未安装Integration Services )和一台单独的SQL服务器。我已经创建了一个ASP页,通过在包所在的SQL服务器上启动代理作业来远程执行SSIS包。该软件包读取由网页用户选择的excell文件,处理数据并将结果存储在数据库中。
我的问题是:在运行时将来自SSIS的日志数据传递回ASP页面的好方法是什么,这样用户就可以获得有关其请求结果的一些合理信息?
发布于 2011-10-04 14:13:39
首先,我建议打开本机SSIS日志记录并将其转储到SQL Server目标。这是一个8次点击的过程,所以真的没有理由不启用它。获取OnTaskFailed、OnError,也许还有OnInformation和OnWarning,这取决于您想要返回给用户的信息类型。
完成此操作后,如果所选数据库中不存在表,则当包运行时,SSIS将足够智能地在该数据库中创建msdb.dbo.sysdtslog90 / msdb.dbo.sysssislog (2005 / 2008+)的副本,并开始记录到该数据库中。
此时,您的作业已经运行,执行历史记录将自动转储到该日志表中,您可以提取该信息。当作业运行时,会生成一个新的GUID,该ExecutionId是您将特定运行的所有活动联系在一起的方式。
我不确定您是如何将有关要处理哪个Excel文件的信息传递给作业的,也许您没有考虑到并发执行,并且一次只能运行一个文件。如果是这种情况,那么您总是可以在日志中查询最近的执行,并假定它与站点上的用户相关联。
否则,我可能会考虑做一些事情,比如发出日志中的唯一文件名[Script task,~ Dts.Events.FireInformation(String.Format("FileName:{0}",Dts.VariablesMyExcelCM.Name.ToString(),...);],然后做一些巫术来解析日志,假设你不能只创建一个文件名来执行id运行表,这将是将运行绑定到一个特定文件的更干净的方法,它将允许你链接回syssisslog。
编辑
CREATE TABLE
dbo.ExecutionToFileMapping
(
mapping_id int identity(1,1) NOT NULL PRIMARY KEY
, executionid uniqueidentifier NOT NULL
, file_name varchar(250) NOT NULL
)
在包中,拖动控制流上的执行SQL任务,并将连接管理器指向具有上表的数据库。您的查询将类似于“参数映射”选项卡上的“INSERT INTO dbo.ExecutionToFileMapping (executionid, file_name) SELECT ?, ?
”,连接与Excel文件名对应的局部变量,然后使用系统变量ExecutionInstanceGUID。当该语句被触发时,它将使用执行GUID和文件名在表中创建一个条目。
然后,您可以将日志记录结果链接到特定文件
SELECT
E.file_name
, L.*
FROM
dbo.sysssislog L
INNER JOIN
dbo.ExecutionToFileMapping E
ON E.executionid = L.executionid
结束编辑
最后,尽管我非常喜欢SSIS,但使用Excel作为数据源是一种非常令人沮丧的做法,尤其是当涉及到用户生成的电子表格时。我数不清“电子表格看起来一样”的实例数,但SSIS却指出格式不同。我有一个更好的体验,就像这样通过OLEDB查询所以问题讨论Query excel sheet in c#取决于您的SQL Server版本,然后我利用了2008+中的表值参数,基本上将东西直接转储到表中。
https://stackoverflow.com/questions/7645656
复制相似问题