我正在开发一个SSIS包,以便将数据从ERP系统()传输到定制的CRM解决方案。我需要转移/更新的事情之一是客户。在客户关系管理系统中,有一个称为CustomerID的领域,它是客户关系管理环境特有的,必须在数据从ERP系统传输到CRM系统时设置。
问题是,我必须调用一个存储过程来获取要插入的下一个客户的CustomerID。我怎样才能在SSIS内部做到这一点?我目前正在使用数据流来传输数据,我可以看到的唯一调用存储过程的地方是ADO任务中的stored查询,每次调用该过程都会增加ID,因此每次运行SSIS包时,它都会更新客户关系管理数据库中的所有客户的CustomerID字段。
存储过程驻留在自定义CRM应用程序上。存储过程不接受任何输入参数。它只是在每次调用时输出标量值,如CT000001
、CT000002
等。
我的其他选择是如何正确地做到这一点呢?
发布于 2013-02-20 20:41:02
您需要使用脚本组件为每一行调用存储过程,并将值添加到下游到目标的管道。
示例SSIS 2012包说明了一个示例:
该示例使用以下数据库对象。
dbo.CRM
将包含目标客户关系管理数据。dbo.ERP
保存源ERP数据。dbo.CustomerId
是客户关系管理系统中的一个假设表,用于增加客户数量。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
ADO.NET Source
、Script Component (Transformation)
和ADO.NET目标。脚本组件将涉及以下配置。
Connection Managers
选项卡页ADONET_PracticeDB
,并给它一个类似于ADONET_PracticeDB
的名称此连接管理器将在脚本组件代码中使用。
Inputs and Outputs
选项卡页ERP
,将输出重命名为CRM
Add Column
。Script
选项卡页。
Edit Script...
”。PreExecute
方法中启动命令对象。ERP_ProcessInputRow
方法中为管道中的每一行调用存储过程,以生成新的客户ids。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行,并且成功地调用了存储过程来添加客户Ids。
在第二次执行包之后,您可以注意到又插入了4行,并且存储过程成功地增加了客户Ids。
希望这能给你个主意。
https://stackoverflow.com/questions/14987703
复制相似问题