我正在运行一个SSIS包,从平面文件中加载一百万行,该文件使用脚本任务进行复杂转换,并使用SQL Server表目标。我试图找出最好的方法(好吧,在这个阶段的任何方式)写出一个不同的表行数(可能是1000的倍数,以更高效)在数据流处理期间。这样我就可以通过定期查询表来确定整个任务可能需要几分钟的进度百分比。
我似乎无法将任何SQL任务添加到流中,所以我猜测唯一的方法是连接到.NET脚本中的SQL数据库。这看起来很痛苦,我甚至不确定它是否可能。还有另一种更优雅的方式吗?我已经看到了对“Rows Read”性能计数器的引用,但不确定我在SSIS中访问它的位置,并且仍然不确定如何在数据流处理期间将其写入SQL表。
任何建议表示赞赏。
格伦
答案 0 :(得分:4)
这里有两个简单的选择:
选项1:使用SSIS内置日志记录并观察进度事件。这可以配置为记录到几个不同的输出,包括关系数据库和平面文件
查看更多Here
选项2:您可以添加一个SSIS脚本组件,该组件可以将通知发送到外部系统,如数据库表
答案 1 :(得分:3)
我最近以稍微不同的方式解决了这个问题,我发现使用脚本并在代码中打开单独的连接来优于DB:
答案 2 :(得分:1)
为什么不编写.NET应用程序,并且可以集成到该应用程序中以获取有关SSIS包所在位置的信息。
基本上,您可以获得发送到控制台的所有内容,并且可以附加事件处理程序以在处理程序包时获取信息。
这是一个可以帮助您采用这种方法的链接: http://www.programminghelp.com/database/sqlserver/sql-server-integration-services-calling-ssis-package-in-c/
答案 3 :(得分: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%。
感谢您提出的所有建议。
答案 4 :(得分:0)
使用行的应用程序是否计算.net应用程序?在应用程序之间共享信息时,有许多可接受的实践。也许你应该看看他们。对于您的特定情况,如果是.net应用程序使用此行号来计算进度,可能是您可以将信息存储在除DB表之外的其他位置,如文件系统,Web服务,Windows环境变量,日志(像Windows事件日志)等等,现在我想到了一些。我认为在脚本组件中使用行计数表单更新Windows环境变量将是一个足够好的解决方案。就像使用全局变量在程序内的两个函数之间共享数据一样。 :)