您需要使用脚本组件为每一行调用存储过程,并将值添加到下游到目标的管道中。
说明示例的示例 SSIS 2012 包:
该示例使用以下数据库对象。
SQL Server 2012 数据库名为 PracticeDB。在这种情况下,CRM 和 ERP 表都在同一个数据库中以保持简单。
表dbo.CRM
将包含目标 CRM 数据。
表dbo.ERP
包含源 ERP 数据
表dbo.CustomerId
是 CRM 系统中的一个假设表,将用于增加客户编号。
dbo.GetCustomerId
每当调用存储过程时,都会增加客户编号。
创建上述数据库对象的脚本:
下面的脚本将创建上述对象并将一些行插入到源 ERP 表中。
USE PracticeDB;
GO
CREATE TABLE dbo.CRM(
CRMId int IDENTITY(1,1) NOT NULL,
CustomerId int NOT NULL,
CustomerName varchar(50) NULL
);
GO
CREATE TABLE dbo.ERP(
ERPId int IDENTITY(1,1) NOT NULL,
CustomerName varchar(50) NOT NULL
);
GO
CREATE TABLE dbo.CustomerId(
Id int NOT NULL
);
GO
CREATE PROCEDURE dbo.GetCustomerId
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS(SELECT Id FROM dbo.CustomerId)
INSERT INTO dbo.CustomerId (Id) VALUES(1);
ELSE
INSERT INTO dbo.CustomerId (Id)
SELECT MAX(Id) + 1 FROM dbo.CustomerId;
SELECT MAX(Id) AS CustomerId FROM dbo.CustomerId;
END;
GO
INSERT INTO dbo.ERP (CustomerName) VALUES
('John Doe')
, ('Jane Doe')
, ('Stephen Smith')
, ('Dean Jones')
;
GO
创建一个 SSIS 包并创建一个 ADO.NET 连接管理器以连接到适当的数据源。
将数据流任务拖放到控制流选项卡上
在数据流任务中,拖放组件ADO.NET Source
和Script Component (Transformation)
ADO.NET 目标。
ADO.NET Source将从表dbo.ERP中读取数据
ADO.NET Destination将数据插入表dbo.CRM
脚本组件将涉及以下配置。
C# 中的脚本组件代码
#region Namespaces
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Data.OleDb;
using System.Data.SqlClient;
#endregion
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
IDTSConnectionManager100 manager;
SqlConnection connection = null;
SqlCommand command = null;
public override void PreExecute()
{
manager = base.Connections.PracticeDB;
connection = new SqlConnection();
connection = (SqlConnection)manager.AcquireConnection(null);
command = new SqlCommand();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "dbo.GetCustomerId";
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void ERP_ProcessInputRow(ERPBuffer Row)
{
Row.CustomerID = Convert.ToInt32(command.ExecuteScalar());
}
}
关闭脚本组件
在执行包之前对数据执行以下查询以检查行。
表选择查询:
SELECT * FROM dbo.ERP;
SELECT * FROM dbo.CRM;
SELECT * FROM dbo.CustomerId;
首次执行包后,您会注意到已插入 4 行,并且成功调用了存储过程以添加客户 ID。
在第二次执行包后,您可以注意到已经插入了 4 行,并且存储过程已成功增加客户 ID。
希望能给你一个想法。