我有一个简单的SSIS包,我在VS2008中编辑。 基本上做的是运行相同的SQL StoredProc,驻留在不同的SQL服务器中,并将它们的输出聚合到一个平面文件中。 简单地说,四个OLE DB数据源转到'Union All'输出。
如果其中一个服务器出现故障,我怎样才能让软件包跳过该源的验证,从而跳过处理,同时仍然汇总可能的内容?
我已快速阅读ConnectionStrings在文件中,使用脚本等等。希望我能避免这种情况。
我事先感谢你的帮助。
答案 0 :(得分:2)
以下是一些可能的解决方案:
如果数据库本身不可用但服务器可用,那么您可以将默认连接更改为始终可用的内容,如系统数据库(master,msdb,tempdb,model)。我在查询日志传送的数据库时使用这种技术,因为它们每天每小时都定期处于“恢复”状态。
如果有另一台服务器始终可用,那么您可以在两者之间创建链接服务器,并使用始终可用的数据库服务器解决错误处理。
您可以拥有单独的数据流,并且每个数据流都可以将数据附加到文件而不是覆盖内容。然后,您可以设置DelayValidation = True和MaximumErrorCount<>这将允许每个数据流成功,同时避免导致程序包失败错误。
使用脚本任务执行查询。这将使您能够最大程度地控制如何使用数据源处理异常。对于下面奇怪的示例代码代码感到抱歉,但是代码块没有像通常那样对我进行格式化,所以我尝试使其工作增加了大量的死区。示例代码的要点是向您展示如何查询数据库并捕获错误。您总是可以忽略错误并成功完成。
// 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;
}