如何记录SSIS的输出执行SQL任务

时间:2015-11-16 07:39:40

标签: ssis ssis-2012 ssis-2008

我是SSIS的新手。

我使用Execute SQL Task创建了SSIS包。我打了一个存储过程。 我的存储过程打印很少的消息,如 '插入已开始' '更新已开始' '更新已完成' 但它不会返回任何结果集。

如何将存储过程的输出写入SSIS中的日志文件。

请帮助我,过去两天我一直在努力。

我尝试过像这样使用DTExec

DTExec / f“C:\ Users \ Karthick \ Desktop \ SSIS \ Package.dtsx”> MyOutput.txt

但它只打印执行SQL任务值而不打印存储过程打印语句。

3 个答案:

答案 0 :(得分:2)

SSIS是一种产品,如果你点击它就足够了,它最终会做一些事情。但严肃的人,它让我想起VB6有一个糟糕的一天...

这听起来像一个简单的事情,但它需要大量的右键点击并在这里和那里悄悄地删除一些代码。以下是步骤:

  1. 在存储过程(SPROC)中声明一个或多个output parameters以包含您的状态消息
  2. 在SSIS中,modify your call向SPROC提供SSIS问号"通配符" (或他们称之为的任何东西)
  3. 向SSIS
  4. 添加variable
  5. Map SPROC output parameter(s)到SSIS变量
  6. 在SSIS中设置logging provider
  7. 启用event以触发将状态消息写入日志
  8. 创建另一个任务是SSIS实际将数据写入日志。我建议使用SQL,但由你决定
  9. 如果您阅读上面的链接,您将会明白这一点。继续阅读一些细节和编辑评论。

    通过声明一个或多个输出参数并使用您的状态信息设置它们,可以使用SPROC启动。

    SET @my_status = 'Insert Started'
    

    也许你想将所有消息连接成一个输出参数,或者有多个输出参数。由你决定。

    现在,右键单击SSIS Control Flow画布并添加变量。如果您有更多SPROC输出参数,请冲洗并重复。

    右键单击SQL任务并编辑SQL调用,如下所示:

    EXEC myStoredProcedure ? OUTPUT
    

    如果您有输入参数,则需要在此处进行说明。的?很重要,因为它表示基于零的编号参数,您必须映射,以便SSIS实际对您的状态消息执行任何操作。该设计让人联想到Wordstar邮件在个人计算的石器时代的合并。

    转到参数映射。单击“添加”并查找变量。这将是丑陋的事情

    User::my_status
    

    如果我们都认为参数名称是参数名称,那么我们都会错。在这个例子中,你将把0(零)放在这里,因为这显然是你SPROC中的零eth参数。

    好的,现在您已经设置了一个可以记录的变量。但是你还没有完成。您必须设置另一个Execute SQL Task来实际记录它。我不打算引导您完成这位亲爱的读者,但希望Aalam Rangi优秀的文章仍然可以为您提供完成此项工作所需的一切。简而言之,您必须a)设置SSIS日志记录提供程序,b)启用将触发将数据写入日志的事件,c)编写一个带有更多问号的SQL插入语句,该语句将实际写入您的数据到您要登录的标准SQL表。如果您想要登录文件,本文仍然会有所帮助。这是插入代码,适用于SSIS和Visual Studio 2015.感谢Aalam!

    INSERT INTO [dbo].[sysssislog]
    ([event]
    ,[computer]
    ,[operator]
    ,[ source]
    ,[sourceid]
    ,[executionid]
    ,[starttime]
    ,[endtime]
    ,[datacode]
    ,[databytes]
    ,[message])
    VALUES
    ('*SSIS-OnVariableValueChanged' -- Custom event name
    ,? -- param 0
    ,? -- param 1
    ,? -- param 2
    ,? -- param 3
    ,? -- param 4
    ,? -- param 5
    ,? -- param 6
    ,0 -- Zero
    ,'' -- Blank string
    ,?) -- param 7
    

    快乐点击!

答案 1 :(得分:0)

你可以这样接近,

  • 在SQL表中记录SSIS
  • 将存储过程记录在表中
  • 创建一个视图,例如一起查看logtable
  • 并使用SSIS在文件中打印此视图

答案 2 :(得分:0)

我猜您无法通过Execute SQL Task捕获存储过程的打印消息。为此,您需要使用Script TaskScript Component。在脚本中,您可以调用存储过程并使用事件处理程序InfoMessage来捕获存储过程中的消息。

以下示例代码 -

        public event SqlInfoMessageEventHandler InfoMessage;
        void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
        {
            using (StreamWriter writer = new StreamWriter(<your log file path>))
                 {
                  writer.Write(e.Message);
                 }
        }

        public void Main()
        {
         using (var conn = new SqlConnection(<your connection manager>))
         using (var command = new SqlCommand(<your sp name>, conn)
             {
             CommandType = CommandType.StoredProcedure
             })
         try
            {
             {
              ((SqlConnection)conn).InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);
                conn.Open();
                command.ExecuteNonQuery();
             }
            }
         catch
            {
              throw;
            }
         finally
            {
              command.Dispose();
            }

         Dts.TaskResult = (int)ScriptResults.Success;
         }