我的情况如下。
源数据如下(XML文件)::
ID CatType Name
11 A Raj
22 A Rai
33 B Raki
44 B Krish
55 A Rem
66 B Ram
我必须将上方加载到下面的甲酸盐中。
ID CatType Name LegacyID
1 A Raj 11
2 A Rai 22
1 B Raki 33
2 B Krish 44
3 A Rem 55
3 B Ram 66
ID
和CatType
是目标表中的复合键。我从源头获取CatType。在加载数据时,我必须通过选择目标表中的CatType =?(基于CatType)的Max(ID)来增加ID
如何在SSIS中加载这些记录,是否有人能指出我正确的方向?
答案 0 :(得分:3)
以下是使用SSIS 2008 R2
创建的示例SSIS包,它演示了您要实现的目标。示例包将传入的文件数据加载到临时表中。然后使用SQL Server Rank
函数和Partition
子句,您可以根据您的要求加载数据。此示例假定您的数据库版本为SQL Server 2005 or above
。由于您没有提供精确的XML文件格式,因此我使用CSV文件格式作为输入文件。
Source_001.csv
和Source_002.csv
的示例CSV文件。创建了两个文件只是为了显示包逻辑的工作原理。
dbo.CategoryName
的目标表。这是将数据加载到的最终表。它在列Id
和CatType
上有复合键。
dbo.CategoryName_Staging
的临时表。这是文件数据临时加载的位置。此临时表结构模仿传入的文件结构。
在SQL Server数据库中,使用底部提供的存储过程脚本部分中提供的脚本创建名为 dbo.PopulateDestination
的存储过程这篇文章。此存储过程将 RANK
函数与 PARTITION
子句结合使用,以识别应分配给CatType值的正确ID。
创建一个新的SSIS包。创建名为SQLServer
的OLE DB连接管理器。这将指向您的SQL Server数据库。创建了名为Source
。
C:\temp\
LegacyId
- 整数,CatType
- 字符串(10),Name
- 字符串(30)数字表示OutputColumnWidth。
Execute SQL task
,然后放置Data Flow Task
,然后放置另一个Execute SQL task
。
CategoryName
以查找以下数据。
Source
的平面文件连接管理器。将文件名路径更改为 Source_002.csv
,以便阅读第二个文件。
CategoryName
以查找以下添加数据,并注意Id列是否正确普及。希望有所帮助。
<强> Stored Procedure Script
强>:
CREATE PROCEDURE [dbo].[PopulateDestination]
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.CategoryName (Id, CatType, Name, LegacyId)
SELECT MAXID.Id + RANK() OVER(PARTITION BY CatType ORDER BY LegacyId) Id
, CS.CatType
, CS.Name
, CS.LegacyId
FROM dbo.CategoryName_Staging CS
CROSS APPLY (
SELECT COALESCE(MAX(Id), 0) Id
FROM dbo.CategoryName C
WHERE C.CatType = CS.CatType
) MAXID
END
答案 1 :(得分:1)
那么你真正需要的是根据cat类型创建一个新的ID列并将列名从ID更改为旧ID?
如果是,您可以使用derived column
执行这两项操作