SSIS - 在OLE DB目标中的表中填充未映射的列

时间:2012-11-28 23:14:14

标签: sql sql-server ssis etl dataflow

正如您在下图中看到的,我在SQL Server中有一个表,我通过平面文件源填充。目标表中有两列我想根据下面列出的逻辑更新:

  • SessionID - 第一次CSV导入中的所有行的值都为1;第二个导入的值为2,依此类推。
  • TimeCreated - CSV导入发生时的日期时间值。

我不需要帮助如何编写TSQL代码来完成这项工作。相反,我希望有人建议在SSIS中将其实现为数据流任务的方法。

enter image description here

提前感谢您的想法。

编辑11/29/2012

由于到目前为止所有答案都建议在SQL Server端处理这个问题,我想向您展示我最初尝试做的事情(见下图),但它没有用。 SSIS将数据插入目标表后,触发器未在SQL Server中触发。

如果你们中的任何一个人能够解释为什么触发器没有触发,那就太棒了。

enter image description here

3 个答案:

答案 0 :(得分:5)

如果您能够修改目标表,则可以使SessionID和TimeCreated的默认值为您完成所有工作。 SessionID将是一个自动增量整数,而TimeCreated的默认值将是getdate()或gettime(),具体取决于数据类型。

现在,如果您确实需要将值作为工作流程的一部分创建,则可以为每个值使用变量。

SessionID是一个包变量,由执行SQL任务设置。只需引用结果集中的变量,让SQL确定要使用的下一个数字。但是,这有可能出现并发问题。

通过基于系统变量StartTime在数据流中创建派生列,可以轻松完成TimeCreated。

答案 1 :(得分:2)

您可以使用派生列填充TimeCreated列,如果您希望数据流的时间发生,您只需使用日期和时间函数来获取当前日期时间。如果您想要整个包(所有文件)的公共时间戳,您可以使用系统变量@[System::StartTime](或称之为)。

对于CSV循环(我猜),您使用foreach循环容器,并将迭代值映射到您在SessionID的派生列中映射的用户变量,如上所述。

答案 2 :(得分:0)

首先,我最好在SQL Server端做这个:) 但如果您不想或不想在服务器端执行此操作,则可以使用此方法:

很明显,你需要在某个地方存储SessionID,你可以为SQL Server中的那个或更好的某些设置表创建一个txt文件,或者可以有其他方法。

要将列SessionIDTimeCreated添加到OLE目标,您可以使用Derived columns