【问题标题】:Logging information when executing remotely SSIS from ASP.NET从 ASP.NET 远程执行 SSIS 时记录信息
【发布时间】:2012-05-05 12:03:58
【问题描述】:

我有一个 Web 服务器(未安装集成服务)和一个单独的 SQL 服务器。我创建了一个 ASP 页面,通过在包所在的 SQL 服务器上启动代理作业来远程执行 SSIS 包。该包读取网页用户选择的excell文件,处理数据并将结果存储在数据库中。

我的问题是:什么是在运行期间从 SSIS 传回 ASP 页面记录数据的好方法,以便用户对他的请求结果有一些明智的信息?

【问题讨论】:

    标签: asp.net logging ssis


    【解决方案1】:

    首先,我建议打开本机 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+ 中利用表值参数并基本上转储直接放入表格中。

    【讨论】:

    • 你明白我的情况 billinkc。我已经启用了 SSIS 的日志记录,但我的问题是如何确定 sysssilog 表中的哪个条目与哪个用户执行配对。我曾想过抓住最新的,但似乎不是一个可靠的解决方案(我什至不阻止并发执行)。不过,我不明白您答案的“为执行 ID 运行表创建文件名”部分。你能解释一下吗?
    • 提出了将文件名寻址到执行表位的答案
    • 谢谢blinkc。好主意啊。由于文件名不是唯一的(两个用户可以上传相同的文件),我将通过传递登录用户的用户名来调整您的建议,然后为该用户获取最大 mapping_id 以跟踪相应的 executionid。还没有尝试过,但我相信它会起作用。
    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多