这是一个使用它创建的示例 SSIS 包SSIS 2008 R2
,它演示了您要实现的目标。示例包将传入的文件数据加载到临时表中。然后将 SQL ServerRank
函数与Partition
子句结合使用,您可以根据需要加载数据。此示例假定您的数据库版本为SQL Server 2005 or above
. 由于您没有提供确切的 XML 文件格式,因此我使用 CSV 文件格式作为输入文件。
- 让我们创建两个名为
Source_001.csv
和的示例 CSV 文件Source_002.csv
。创建了两个文件只是为了显示包逻辑的工作原理。
- 在 SQL Server 数据库中,创建名为
dbo.CategoryName
. 这是将加载数据的最终表。它在列上具有复合键,Id
并且CatType
.
- 在 SQL Server 数据库中,创建名为
dbo.CategoryName_Staging
. 这是临时加载文件数据的地方。这种暂存表结构模仿传入的文件结构。
- 如下所示配置平面文件连接管理器。我已将源 csv 文件放在路径中
C:\temp\
- 在Flat File Connection Manager Editor的Advanced选项卡上,重命名列信息。- integer , - string (10) , - string (30)数字表示 OutputColumnWidth。
LegacyId
CatType
Name
- 在 SSIS 包的控制流选项卡上,放置一个
Execute SQL task
, 后跟Data Flow Task
另一个Execute SQL task
.
- 双击第一个执行 SQL 任务并将其配置为截断临时表。
- 双击数据流任务以切换到数据流选项卡。在数据流选项卡中,放置一个平面文件源管理器以读取 CSV 文件并放置一个 OLE DB 目标以将数据写入临时表。
- 如下所示配置平面文件源以使用平面文件连接管理器读取平面文件源。
- 如下所示配置 OLE DB 目标以接受传入数据并写入目标文件。
- 返回控制流选项卡,配置最后一个执行 SQL 任务以调用新创建的存储过程。软件包开发现已完成。
- 执行包。请记住,该包配置为仅读取第一个源文件Source_001.csv。打包执行后,查询目标表
CategoryName
找到如下数据。
- 现在,停止 SSIS 包的执行,双击名为
Source
. 将文件名路径更改为Source_002.csv
以读取第二个文件。
- 再次执行包。该包现在配置为读取第二个源文件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