SSIS:如何获取审核中已更新和已删除的行数?

时间:2018-11-25 18:39:34

标签: ssis

想象一下,要在变量中保存表中已更新或删除的行数。 ‌ 这是我所做的步骤: 首先,在控制流中,我创建了一个数据流任务。 他们在数据流中创建了一个源(在我的情况下是一个excel文件),然后我继续创建两个变量来对这些行进行计数-countDeleted和countUpdated,然后将变量连接到两个行计数转换,并将它们连接我的目的地(OLE DB)。

现在在控制流程中,我该怎么办? 创建一个SQL执行任务?还是脚本任务??最好的方法是什么?使用的代码是什么?

感谢您的帮助。 P‌S:我只有4周的SSIS休假时间,非常抱歉:)

2 个答案:

答案 0 :(得分:1)

仅插入旧数据库目标 。它不能更新或删除

您更新或删除的逻辑是什么?

如果您只是开始学习SSIS中的操作,您最终会发现使用OLE DB Command进行逐行删除和插入的建议。

我认为这是可以避免的。它不能扩展(对于小型记录集可以正常工作,而对于大型记录集则可以失败),并且很难在OLE DB命令中维护参数映射。尽管您仍然应该尝试一下以熟悉它。

我的建议是将Excel数据加载到暂存表中,执行批处理DELETEUPDATE语句以加载数据,并使用@@ROWCOUNT捕获更新的记录。

例如;

您描述的现有数据流可用于加载到名为StagingTable的表中

在数据流之前,您应该运行一个执行SQL任务(在“控制流”窗格中,而不是在“数据流”窗格中),以清除登台表:

TRUNCATE TABLE StagingTable;

因此,首先使它起作用-重复运行程序包将清除临时表,然后将Excel加载到临时表中而不创建重复项

这本身就是一个挑战,因为Excel是一种可怕的数据交换格式。

工作完成后,您将在末端添加一个执行SQL任务,该任务运行一些SQL,该SQL将删除您想要的记录并捕获计数。例如:

DELETE FROM MyFinalTable WHERE PriamryKey IN (SELECT PrimaryKey FROM StagingTable);
SELECT @@ROWCOUNT;

然后按照此处的说明将其加载回SSIS变量

http://microsoft-ssis.blogspot.com/2011/03/rowcount-for-execute-sql-statement.html

此行计数在做什么?您是否正在将其写入日志表?保存 自己将它拉回到SSIS变量中并直接将其编写就很麻烦:

DELETE FROM MyFinalTable WHERE PriamryKey IN (SELECT PrimaryKey FROM StagingTable);

INSERT INTO LogTable(Table,Operation,Type)
SELECT 'MyFinalTable','Delete', @@ROWCOUNT;

根据我的经验,如果可以在数据库中执行,则将卷积逻辑构建到SSIS包中不是一个好主意。尽管它确实取决于最终必须维护它的人。希望您能意识到,这种T-SQL方法是一种基于代码的更直接的方法,而不必在属性页和事件以及SSIS包中的其他位置进行挖掘。

答案 1 :(得分:0)

我假设您正在使用“执行SQL任务”进行更新和删除?如@ Nick.McDermaid所述,在执行DML时,在数据流中使用OLE DB命令会带来各种问题。您可以使用此任务的ExecValueVariable属性,通过“执行SQL任务”在表中找到更新,插入或删除的行数。设置将行数保留为该属性的变量,它将返回受影响的行数。请注意,无论组件中是否有批次(即GO分隔符),都只会返回Execute SQL Task中最后一条语句影响的行数。