我有一个Web服务器(没有安装Integration Services)和一个单独的SQL服务器。我创建了一个ASP页面,通过在包所在的SQL服务器上启动代理作业来远程执行SSIS包。该软件包读取由网页用户选择的excell文件,处理数据并将结果存储在数据库中。
我的问题是:在运行时期间从SSIS传回ASP页面记录数据的好方法是什么,所以用户有一些关于他的请求结果的合理信息?
答案 0 :(得分:2)
作为第一个剪辑,我建议打开本机SSIS日志记录并将其转储到SQL Server目标。这是一个8点击过程,所以没有理由不启用它。 Grab 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.Variables [MyExcelCM]) .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
)
在包中,拖动控制流上的Execute SQL Task,并使用上表将连接管理器指向数据库。您的查询看起来像
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查询Excel就像这样问题讨论Query excel sheet in c#根据您的SQL Server版本,我会利用2008年以上的表值参数和基本上把东西直接扔到桌子里。