看到其他问题的答案并没有完全解决我的问题,我想知道如何在SSIS中使用OLE DB命令转换来执行插入并立即获取每行的结果主键作为新列插入,所有都在相同的数据流任务中。这听起来应该是SSIS中常见的,内置的,相当简单的事情,对吗?
所以对我来说显而易见的首选是使用OLE DB命令,我在SELECT
中执行OUTPUT
并在命令中包含INSERT INTO dbo.MyReleaseTable(releaseDate)
OUTPUT ?=Inserted.id
VALUES (?)
子句:
2 0 obj
<< /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1 3 0 R /F2 4 0 R /F3 6 0 R >> /XObject << /XT5 5 0 R /I0 11 0 R >> >>
endobj
7 0 obj
<</Type /Annot /Subtype /Text /Rect [235.275591 737.008110 263.622047 765.354567] /Contents (þÿ
只有我无法弄清楚如何在OLE DB命令(带输出)中执行此操作并且它不会抱怨。我已经读过使用存储过程来执行此操作,所以如果我想这样做,我是否需要使用存储过程?
假设这不起作用。我可以使用脚本转换并执行直接SQL,对吗?好吧,如果这是我必须做的,那么使用自定义代码和SSIS块组件之间的界限会变得模糊,我很想抛弃SSIS,只是在代码中执行整个ETL。
然后我听说有关使用执行SQL任务的讨论。那么现在我甚至不能在1个数据流任务中做1个数据流?我做对了吗?我想在1个数据流任务中保留1个单一数据流,而不必在单独的任务之间打破我的1个流量。
如果事实证明这个看似简单的数据流目标没有内置到SSIS中,那么我将考虑完全转储SSIS。 Talend有免费的ETL产品,不是吗?
答案 0 :(得分:2)
嗯,这可以通过DataFlow中的SSIS完成,但有一些技巧。您需要使用输入和输出参数创建存储过程,并在DataFlow中重复使用,如here所述,获取结果值。
这种方法的缺点是:
没有性能损失的解决方案 - 在两个DataFlow中执行此操作,首先将值插入到某个临时表中,然后执行第二个DF - 在OLE DB源上执行SQL MERGE命令并根据需要处理输出数据。所有这些内部交易,由MSDTC或您自己处理。