4

我正在运行一个 SSIS 包来从一个平面文件中加载一百万行,该文件使用一个脚本任务来进行复杂的转换和一个 SQL Server 表目标。我试图找出在数据流处理期间将行数(可能以 1000 的倍数更有效)写入不同表的最佳方法(嗯,现阶段的任何方法)。这样我就可以通过定期查询表来确定可能需要几分钟的任务的进度百分比。

我似乎无法将任何 SQL 任务添加到流程中,所以我猜测唯一的方法是连接到 .NET 脚本中的 SQL 数据库。这似乎很痛苦,我什至不确定这是否可能。还有其他更优雅的方式吗?我已经看到对“Rows Read”性能计数器的引用,但不确定我在 SSIS 中的何处访问它,并且仍然不确定如何在数据流处理期间将其写入 SQL 表。

任何建议表示赞赏。

格伦

4

5 回答 5

4

这里有两个简单的选择:

选项 1:使用 SSIS 的内置日志记录并观看正在进行的事件。这可以配置为记录到几个不同的输出,包括关系数据库和平面文件

在这里查看更多

选项 2:您可以添加一个 SSIS 脚本组件,该组件可以向外部系统(如数据库表)发出通知

于 2009-09-26T03:28:44.793 回答
4

我最近以稍微不同的方式解决了这个问题,我发现它优于使用脚本和在代码中打开与 DB 的单独连接:

  • 在源查询或变换形状中,添加行数(增量)
  • 在条件分支中,只要数字是例如 1000 的倍数,就使用模表达式 (%) 进行分支,但这可以是可配置的或基于源数据(例如数据的 0.0% 到 100.0%)
  • 创建日志连接管理器并使用目标。控制批处理大小,以便将行立即提交到目标表。
于 2012-02-07T20:41:31.623 回答
1

为什么不编写一个 .NET 应用程序,您可以将其集成到其中以获取有关 SSIS 包所在位置的信息。

基本上,您可以获得发送到控制台的所有内容,并且您可以附加事件处理程序以在处理程序包时获取信息。

这是一个可以帮助您采用这种方法的链接:http: //www.programminghelp.com/database/sqlserver/sql-server-integration-services-calling-ssis-package-in-c/

于 2009-09-25T03:37:59.743 回答
1

好的,终于取得了一些成功......在脚本组件中添加了对以下子的调用:

Sub UpdateLoadLog(ByVal Load_ID As Int32, ByVal Row_Count As Int32, ByVal Row_Percent As Int32, ByVal connstr As String)
    Dim dbconn As OleDbConnection
    Dim Sql As String
    Dim dbcomm As OleDbCommand

    dbconn = New OleDbConnection(connstr)
    dbconn.Open()
    Sql = "update myTable set rows_processed = " & Row_Count & ", rows_processed_percent = " & Row_Percent & " where load_id = " & Load_ID & " and load_log_type = 'SSIS'"
    dbcomm = New OleDbCommand(Sql, dbconn)
    dbcomm.ExecuteNonQuery()

    dbconn.Close()
    dbconn = Nothing
    dbcomm = Nothing
End Sub

这将每 1000 行执行一次,并成功更新表。该行在包开始时在控制流中创建时已经存在,并在最后的控制流中再次更新,最终行数和 100%。

感谢您的所有建议。

于 2009-10-01T04:20:37.693 回答
0

使用行数的应用程序是 .net 应用程序吗?在应用程序之间共享信息时,有很多公认的做法。也许你应该看看他们。对于您的特定情况,如果是.net 应用程序使用此行号来计算进度,您可能可以将信息存储在数据库表以外的其他位置,例如文件系统、Web 服务、Windows 环境变量、日志(像 Windows 事件日志)等是我现在想到的一些。我认为在脚本组件中使用行计数形式更新 Windows 环境变量将是一个足够好的解决方案。就像使用全局变量在程序内的两个函数之间共享数据一样。:)

于 2009-09-27T06:03:13.873 回答