5

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

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

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

在此处输入图像描述

预先感谢您的想法。

编辑 2012 年 11 月 29 日

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

如果你们中的任何人都可以解释为什么触发器没有触发,那就太好了。

在此处输入图像描述

4

3 回答 3

6

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

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

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

TimeCreated 很容易通过基于系统变量 StartTime 在数据流中创建派生列来完成。

于 2012-11-28T23:46:31.393 回答
3

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

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

于 2012-11-28T23:46:16.387 回答
-1

首先,我最好在 SQL Server 端进行 :)
但是如果你不想或不能在服务器端这样做,你可以使用这种方法:

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

要添加列SessionIDTimeCreatedOLE 目标,您可以使用派生列

于 2012-11-28T23:40:34.470 回答