如何记录SSIS执行SQL任务的输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何记录SSIS执行SQL任务的输出相关的知识,希望对你有一定的参考价值。
我是SSIS的新手。
我使用Execute SQL Task创建了SSIS包。我打了一个存储过程。我的存储过程打印了一些消息,如“插入已启动”,“更新已启动”,“更新已完成”,但它不会返回任何结果集。
如何将存储过程的输出写入SSIS中的日志文件。
请帮助我,我在过去两天都在挣扎。
我试过像这样使用DTExec
DTExec / f“C: Users Karthick Desktop SSIS Package.dtsx”> MyOutput.txt
但它只打印执行SQL任务值而不打印存储过程打印语句。
SSIS是一种产品,如果你点击它就足够了它最终会做一些事情。但是认真的人,它让我想起VB6有一个糟糕的一天......
这听起来像一个简单的事情,但它需要大量的右键单击并在这里和那里悄悄地删除一些代码。以下是步骤:
- 在存储过程(SPROC)中声明一个或多个output parameters以包含您的状态消息
- 在SSIS中,modify your call向SPROC提供SSIS问号“通配符”(或他们称之为的任何内容)
- 添加variable到SSIS
- Map SPROC output parameter(s)到SSIS变量
- 在SSIS中设置logging provider
- 启用event以触发将状态消息写入日志
- 创建另一个任务是SSIS实际将数据写入日志。我建议使用SQL,但由你决定
如果你阅读上面的链接,你会明白的。继续阅读一些细节和编辑评论。
通过声明一个或多个输出参数并使用状态消息设置它们,可以使用SPROC启动。
SET @my_status = 'Insert Started'
也许你想将所有消息连接成一个输出参数,或者有多个输出参数。由你决定。
现在,右键单击SSIS控制流画布并添加变量。如果您有更多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
快乐点击右键!
我想你无法通过Execute SQL Task
捕获存储过程的打印消息。要做到这一点,你需要使用Script Task
或Script 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;
}
你可以这样接近,
- 在SQL表中记录SSIS
- 将存储过程记录在表中
- 创建一个视图,例如一起查看logtable
- 并使用SSIS在文件中打印此视图
以上是关于如何记录SSIS执行SQL任务的输出的主要内容,如果未能解决你的问题,请参考以下文章
如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中