您需要使用脚本组件为每一行调用存储过程,并将值添加到下游到目标的管道。
说明示例的 SSIS 2012 包示例:
该示例使用以下数据库对象。
-
名为 PracticeDB 的 SQL Server 2012 数据库。在这种情况下,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 Destination。
-
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。
希望能给你一个想法。