SSIS将日志记录变量存储在派生列中

时间:2010-07-15 18:05:36

标签: sql-server-2005 ssis

我正在开发包含两个主要步骤的SSIS包:

第1步:从现有旧系统中获取所有类型的数据,并将其转储到我的数据库中的一系列临时表中。

第2步:将我的临时表中的数据移动到我专门用于项目的更多关系表中。


在第1步中,我只是批量SELECT和批量INSERT;但是,在第2步中,我使用OLEDB Command任务逐行插入到表中,这样我就可以记录发生的所有事情的非常具体的行级活动。这是我对第2步流程的总体布局。

alt text http://dl.dropbox.com/u/2468578/screenshots/step_1.png

您会注意到3个OLEDB任务:1表示实际INSERT,2表示成功/失败INSERT进入我们的记录表。

我正在记录的主要内容是通过此流的每一行的源表/ id和目标表/ id。我将这些东西存储在变量中,并使用派生列将它们添加到数据流中,以便我可以轻松地将它们映射到存储过程的查询参数。

alt text http://dl.dropbox.com/u/2468578/screenshots/step_3.png

我决定将这些日志记录值存储在变量中,而不是对任务中SqlCommand字段中的值进行硬编码,因为我很确定你不能在该字段中放置变量表达式(即{{1 }})。所以,这是我找到的最佳解决方案。

alt text http://dl.dropbox.com/u/2468578/screenshots/step_2.png

这是最好的解决方案吗?可能不是。

将4个日志记录列添加到包含500,000条记录的数据流中是否有良好的性能?可能不是。

你能想到一个更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我真的不认为调用OLEDBCommand 500,000次将是高效的。

如果您已经要进行临时表 - 将它全部加载到临时表,并从T-SQL或其他数据流(或原始文件,然后根据您的完整操作)中取出它。批量插入将大大提高效率。

答案 1 :(得分:0)

如果您真的需要逐行记录信息,请添加到Cade的答案中,最好的方法是利用oledb目标并使用以下一个或两个转换向数据流添加列:

Derived Column Transformation

Audit Transformation

这应该是你最好的选择,不应该增加很多开销