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

问题描述 投票:0回答:1

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

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

sql sql-server ssis ssms
1个回答
0
投票

我要对此采取行动。只是为了清楚起见,我在您的问题中没有太多要继续的信息。

我处理过的大多数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用于所有其他表。

© www.soinside.com 2019 - 2024. All rights reserved.