【问题标题】:SSIS Event Handler - How do I get the entire error message?SSIS 事件处理程序 - 如何获取整个错误消息?
【发布时间】:2019-12-06 04:13:53
【问题描述】:

我已经使用源组件(ODBC 到 Salesforce)设置了一个数据流任务,该组件将行数和任何引发的错误消息写入表中。

我创建了一个 OnError 事件处理程序,它将消息从 System::ErrorDescription 写入一个变量,然后将该变量写入表中。

我的问题是 System::ErrorDescription 没有有趣的错误消息,而是摘要。 这些是在“进度”选项卡中生成的消息:

  • [SRC - 提取帐户 [6]] 错误:System.Data.Odbc.OdbcException (0x80131937):错误 [HY000] INVALID_LOGIN:用户名、密码、安全令牌无效;或用户被锁定。等等等等
  • [SSIS.Pipeline] 错误:SRC - 提取帐户未通过预执行阶段并返回错误代码 0x80131937。

System::ErrorDescription 只有 [SSIS.Pipeline] 错误(“SRC - 提取帐户未通过预执行阶段并返回错误代码 0x80131937”)。 如何返回更详细的 [SRC - 提取帐户 [6]] 消息?

谢谢, 杰森

【问题讨论】:

    标签: ssis


    【解决方案1】:

    您也可以只查询您的 SSISDB 以获取错误。

    使用 event_name 查找错误

    试试这个:

    /*  
    :: PURPOSE
    Show the Information/Warning/Error messages found in the log for a specific execution
    :: NOTES
    The first resultset is the log, the second one shows the performance
    :: INFO
    Author: Davide Mauri
    Version: 1.1
    :: VERSION INFO
    1.0: 
    First Version
    1.1:
    Added filter option on Message Source
    Correctly handled the "NULL" filter on ExecutionId
    */
    USE SSISDB
    GO
    /*
    Configuration
    */
    -- Filter data by execution id (use NULL for no filter)
    DECLARE @executionIdFilter BIGINT = NULL;
    -- Show only Child Packages or everyhing
    DECLARE @showOnlyChildPackages BIT = 0;
    -- Show only message from a specific Message Source
    DECLARE @messageSourceName NVARCHAR(MAX)= '%'
    /*
    Implementation
    */
    /*
    Log Info
    */
    SELECT * FROM catalog.event_messages em 
    WHERE ((em.operation_id = @executionIdFilter) OR @executionIdFilter IS NULL) 
    AND (em.event_name IN ('OnInformation', 'OnError', 'OnWarning'))
    AND (package_path LIKE CASE WHEN @showOnlyChildPackages = 1 THEN '\Package' ELSE '%' END)
    AND (em.message_source_name like @messageSourceName)
    ORDER BY em.event_message_id;
    /*
    Performance Breakdown
    */
    IF (OBJECT_ID('tempdb..#t') IS NOT NULL) DROP TABLE #t;
    WITH 
    ctePRE AS 
    (
    SELECT * FROM catalog.event_messages em 
    WHERE em.event_name IN ('OnPreExecute')
    AND ((em.operation_id = @executionIdFilter) OR @executionIdFilter IS NULL)
    AND (em.message_source_name like @messageSourceName)
    ), 
    ctePOST AS 
    (
    SELECT * FROM catalog.event_messages em 
    WHERE em.event_name IN ('OnPostExecute')
    AND ((em.operation_id = @executionIdFilter) OR @executionIdFilter IS NULL)
    AND (em.message_source_name like @messageSourceName)
    )
    SELECT
    b.operation_id,
    from_event_message_id = b.event_message_id,
    to_event_message_id = e.event_message_id,
    b.package_path,
    b.execution_path,
    b.message_source_name,
    pre_message_time = b.message_time,
    post_message_time = e.message_time,
    elapsed_time_min = DATEDIFF(mi, b.message_time, COALESCE(e.message_time, SYSDATETIMEOFFSET()))
    INTO
    #t
    FROM
    ctePRE b
    LEFT OUTER JOIN
    ctePOST e ON b.operation_id = e.operation_id AND b.package_name = e.package_name AND b.message_source_id = e.message_source_id AND b.[execution_path] = e.[execution_path]
    INNER JOIN
    [catalog].executions e2 ON b.operation_id = e2.execution_id
    WHERE
    e2.status IN (2,7)
    OPTION
    (RECOMPILE)
    ;
    

    【讨论】:

      【解决方案2】:

      我知道这个问题很老了,但我今天遇到了这个问题。 每个错误消息行都会触发 OnError 事件。 因此,要捕获所有错误行,请连接您的变量的值。 像这样的东西: Dts.Variables["MyErrorVar"].Value = Dts.Variables["MyErrorVar"].Value + Environment.NewLine + Dts.Variables["System::ErrorDescription"].Value.ToString()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-07
        • 2010-10-13
        • 1970-01-01
        相关资源
        最近更新 更多