SSIS一次将具有起始范围的递增ID插入多个表中

Posted

技术标签:

【中文标题】SSIS一次将具有起始范围的递增ID插入多个表中【英文标题】:SSIS Inserting incrementing ID with starting range into multiple tables at a time 【发布时间】:2019-11-26 13:36:59 【问题描述】:

是否有一种或几种可靠的变体可以解决简单的任务? 我有许多 XML 文件将转换为 6 个 SQL 表(通过 SSIS)。 在此过程结束之前,我需要在每个表中添加一个新的(实际上 - 所有表通用)列(或字段)。

此列表示具有分配范围和 +1 递增步长的 ID。喜欢 (350000, 1) 是的,我知道如何在 SSMS SQL 阶段解决它。但我需要 SSIS 的 pre-SQL 转换 lvl 的解决方案。 我确信应该有众所周知的模式解决方案来处理它。

【问题讨论】:

我相信常见的方法是使用带有类似计数器的变量的脚本任务,该变量填充 ProcessInputRow 方法上的新列,但这会使您的 DTS 同步(需要逐行处理,尽管它仍然很快),因此如果您正在寻找性能,这不是一个好的选择。 这个模型像link。我看到了。但对我来说,这是一个单表脚本的例子。第一次我不能为多个表转换它。是否可以在link 之类的模型中实现(一个脚本在一个周期内产生一个公共 id)?多快并不重要。或者可能有另一个 ssis 的元素配置? 您可以生成像第二张图像这样的工作流,但您的输入缓冲区必须统一。您必须将所有不同的输入(如果您有超过 1 个)合并到脚本转换中,添加新的 ID 列,然后有条件地拆分输出(通过多个输出缓冲区在脚本组件内部或在脚本外部使用条件拆分在一列上)。 我使用脚本任务/组件来处理 XML 和 JSON,尤其是当您从允许您将信息直接接收回对象的 Web 服务获取数据时。我想我的意思是,您可以在进行插入时取回标识列,以便作为键应用于其他表。 【参考方案1】:

我将对此进行尝试。需要说明的是,我没有太多信息可以回答您的问题。

我处理过的大多数 XML 文件都有一个共同的元素(我们称之为客户),它具有一对多的属性(可以是发票、地址、电子邮件、联系人等)。

因此,您的表格结构将围绕客户呈星形。

因此,您的 XML 将具有一对一的核心客户信息,可以加载到单个主表中,并且将具有发票数组信息和地址数组等。这些数组将是它们自己的表引用客户作为关键。

我想您是在问如何创建该密钥。

先加载客户数据,在加载其他表时返回标识列作为外键。

我发现在脚本组件中这样做最容易。我只解释如何取回密钥。我个人会在 C# 中处理整个过程(反序列化和所有)。

将此添加到使用块:

Using System.Data.OleDB;

根据脚本任务/组件的位置,将此添加到您的主处理或行处理中:

string SQL = @"INSERT INTO Customer(CustName,field1, field2,...)
               values(?,?,?,...); Select cast(scope_identity() as int);";

OleDBCommanad cmd = new OleDBCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = SQL;
cmd.Parameters.AddWithValue("@p1",[CustName]);
...
cmd.Connection.Open();
int CustomerKey = (int)cmd.ExecuteScalar(); //ExecuteScalar returns the value in first row / first column which in our case is scope_identity
cmd.Connection.Close();

现在您可以对所有其他表使用 CustomerKey。

【讨论】:

谢谢!我会尝试实现它。

以上是关于SSIS一次将具有起始范围的递增ID插入多个表中的主要内容,如果未能解决你的问题,请参考以下文章

如何一次将数据插入和更新到 EF 多个表中

如何使用 Codeigniter 3 一次将图像输入到 2 个表中

SSIS - 如何从平面文件插入到具有日期范围的OLE DB?

如何使用 SSIS 将多个表中的数据插入到多个表中?

在 Python 中:一次将 QtableWidget 中的所有条目插入数据库表中

使用 mongoose 一次将多个 ObjectId 插入子文档