我有一个简单的SSIS包,我在VS2008中编辑。 基本上是做什么是运行相同的SQL StoredProc,驻留在不同的SQL服务器,并将其输出聚合到一个平面文件。 简单地说,四个OLE DB数据源去'Union All'输出。SSIS - 连接断开时
如果其中一台服务器出现故障,我怎样才能让软件包跳过对该源进行验证并因此进行处理,同时仍然聚合可能的内容?
我已经快速阅读了ConnectionStrings正在一个文件中,使用脚本等,希望我可以避免这种情况。
我提前感谢您的任何帮助。
我有一个简单的SSIS包,我在VS2008中编辑。 基本上是做什么是运行相同的SQL StoredProc,驻留在不同的SQL服务器,并将其输出聚合到一个平面文件。 简单地说,四个OLE DB数据源去'Union All'输出。SSIS - 连接断开时
如果其中一台服务器出现故障,我怎样才能让软件包跳过对该源进行验证并因此进行处理,同时仍然聚合可能的内容?
我已经快速阅读了ConnectionStrings正在一个文件中,使用脚本等,希望我可以避免这种情况。
我提前感谢您的任何帮助。
这里有几个可能的解决方案:
如果数据库本身是不可用的,但服务器可用,那么你可以更改默认的连接的东西,总是可以像一个系统数据库(主, msdb,tempdb,模型)。在查询日志发布的数据库时,我使用这种技术,因为它们每天每个小时定期处于“恢复”状态。
如果有另一台始终可用的服务器,则可以在两者之间创建链接服务器,并使用始终可用的数据库服务器解决错误处理问题。
你可以有独立的数据流,每个数据流可以附加数据到文件而不是覆盖内容。然后,您可以设置DelayValidation = True和MaximumErrorCount> 012。这将允许每个数据流成功,同时避免导致程序包故障错误。
使用脚本任务执行查询。这将使您能够最有效地控制如何处理数据源的异常。对不起,下面这个奇怪的样例代码,但代码块没有格式化,好像它通常对我来说很好,所以我尝试使它工作增加了大量的死空间。示例代码的要点是向您展示如何查询数据库并捕获错误。您可以随时忽略错误并成功完成。
// Try-Catch block
try
{
bool fireAgain = true;
string SQLCommandText = "EXEC dbo.usp_some_stored_procedure_or_select_statement;";
SqlConnection SQLConnection = new SqlConnection("Data Source=SomeServerName;Initial Catalog=master;Integrated Security=SSPI;Application Name=SSIS-My Package Name;Connect Timeout=600");
SqlCommand SQLCommand = new SqlCommand(SQLCommandText, SQLConnection);
SQLCommand.CommandTimeout = 60 * 60;
SqlDataAdapter SQLDataAdapter = new SqlDataAdapter(SQLCommand);
DataTable dt = new DataTable();
SQLDataAdapter.Fill(dt);
SQLConnection.Close();
RowsRemaining = dt.Rows.Count;
Dts.Events.FireInformation(0, "DataTable Rows", RowsRemaining.ToString(), "", 0, ref fireAgain);
}
catch (SqlException e)
{
Dts.Events.FireError(0, "SqlException", e.Message, "", 0);
Error = 1;
}
// Return results.
if (Error == 0)
{
Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
Dts.TaskResult = (int)ScriptResults.Failure;
}
谢谢您的回答,非常感谢。 我正在给脚本任务去。 我可能会根据服务器是否可用而返回true/false,然后根据可用性有条件地获取并追加数据的数据流? 嗯..想法.. :) – 2010-08-02 01:06:08
我面临的另一个问题是数据整理的文件具有日期时间戳的文件名。这是通过一个包级变量创建的。如果我使用不同的数据流,他们将不得不通过不同的文件连接通过变量引用它? – 2010-08-02 01:17:10
关于基于服务器可用性返回true/false,上面的代码已经为您提供了一个控制返回true/false的变量。如果您想检查特定文本的错误消息以确定要执行的操作,则可以调整异常块以实现此目标。 – 2010-08-10 01:12:35