5

我是 SSIS 的新手。

我使用执行 SQL 任务创建了 SSIS 包。我调用了一个存储过程。我的存储过程打印了几条消息,例如“插入开始”、“更新开始”、“更新完成”,但它不返回任何结果集。

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

请帮助我,我在过去的两天里一直在挣扎。

我尝试像这样使用 DTExec

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

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

4

3 回答 3

3

SSIS 是一种产品,如果您右键单击它,它最终会有所作为。但说真的,伙计们,这让我想起了 VB6 的糟糕日子……</p>

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

  1. 在存储过程 (SPROC) 中声明一个或多个输出参数以包含您的状态消息
  2. 在 SSIS 中,修改您对 SPROC 的调用以包含 SSIS 问号“通配符”(或它们所称的任何名称)
  3. 向 SSIS添加变量
  4. 将SPROC 输出参数映射到 SSIS 变量
  5. 在 SSIS 中设置日志记录提供程序
  6. 启用事件以触发将您的状态消息写入日志
  7. 创建另一个任务是 SSIS 将数据实际写入日志。我建议使用 SQL,但取决于你

如果您阅读上面的链接,您就会明白这一点。请继续阅读以了解一些详细信息和编辑评论。

从您的 SPROC 开始,通过声明一个或多个输出参数并使用您的状态消息设置它们。

SET @my_status = 'Insert Started'

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

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

右键单击您的 SQL 任务并编辑您的 SQL 调用,使其看起来像这样:

EXEC myStoredProcedure ? OUTPUT

如果您有输入参数,则需要在此处说明。这 ?很重要,因为它代表一个从零开始的编号参数,您必须映射该参数才能使 SSIS 实际对您的状态消息执行任何操作。该设计让人想起个人计算石器时代的 Wordstar 邮件合并。

转到参数映射。单击添加并查找您的变量。这将是一些丑陋的东西

User::my_status

如果我们都认为 Parameter Name 是参数名称,那我们都错了。在此示例中,您将在此处输入 0(零),因为这显然是 SPROC 中的 zero-eth 参数。

好的,现在您已经设置了一个可以记录的变量。但你还没有完成。您必须设置另一个执行 SQL 任务才能实际记录此内容。我不会向您介绍这位亲爱的读者,但希望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

快乐的右击!

于 2018-03-01T14:44:51.363 回答
1

你可以这样接近,

  • 在 SQL 表中记录 SSIS
  • 将存储过程记录在表中
  • 创建一个视图,例如一起查看日志表
  • 并在文件中使用 SSIS 打印此视图
于 2015-11-16T08:22:47.130 回答
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;
         }
于 2015-11-16T10:57:56.503 回答