【发布时间】:2012-05-05 12:03:58
【问题描述】:
我有一个 Web 服务器(未安装集成服务)和一个单独的 SQL 服务器。我创建了一个 ASP 页面,通过在包所在的 SQL 服务器上启动代理作业来远程执行 SSIS 包。该包读取网页用户选择的excell文件,处理数据并将结果存储在数据库中。
我的问题是:什么是在运行期间从 SSIS 传回 ASP 页面记录数据的好方法,以便用户对他的请求结果有一些明智的信息?
【问题讨论】:
我有一个 Web 服务器(未安装集成服务)和一个单独的 SQL 服务器。我创建了一个 ASP 页面,通过在包所在的 SQL 服务器上启动代理作业来远程执行 SSIS 包。该包读取网页用户选择的excell文件,处理数据并将结果存储在数据库中。
我的问题是:什么是在运行期间从 SSIS 传回 ASP 页面记录数据的好方法,以便用户对他的请求结果有一些明智的信息?
【问题讨论】:
首先,我建议打开本机 SSIS 日志记录并将其转储到 SQL Server 目标。这是一个大约 8 次点击的过程,所以真的没有理由不启用它。抓住 OnTaskFailed、OnError,当然也可能是 OnInformation 和 OnWarning,这取决于您希望返回给用户的信息类型。
完成后,如果您选择的数据库中尚不存在表,则当包运行时,SSIS 足够智能,可以复制 msdb.dbo.sysdtslog90 / msdb.dbo.sysssislog (2005 / 2008 +) 在该数据库中并开始记录到它。
此时,您的作业已经运行,执行历史记录会自动转储到该日志表中,您可以提取该信息。当作业运行时,会生成一个新的 GUID,而 ExecutionId 是您可以将特定运行的所有活动联系在一起的方式。
我不确定您如何将有关要处理的 Excel 文件的信息传递给作业,也许您不允许并发执行,并且一次只能运行一个文件。如果是这种情况,那么您始终可以在日志中查询最近的执行,并假设它与站点上的用户相关。
否则,我可能会考虑在日志中发出唯一文件名 [脚本任务,~ 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
)
在包中,在控制流上拖动一个执行 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 表示格式不同。我有一个 much 更好的体验只是通过 OLEDB 查询 Excel 就像这个 SO question 讨论 Query excel sheet in c# 根据您的 SQL Server 版本,然后我会在 2008+ 中利用表值参数并基本上转储直接放入表格中。
【讨论】: