0

我正在开发一个 SSIS 包,以将数据从 ERP 系统 ( Microsoft Dynamics AX ) 传输到自定义 CRM 解决方案。我需要转移/更新的一件事是客户。在CRM系统中,有一个叫做CustomerID的字段是CRM环境独有的,数据从ERP系统传输到CRM系统时必须设置。

问题是我必须调用一个存储过程来获取下一个要插入的客户的 CustomerID。如何在 SSIS 中执行此操作?我目前正在使用数据流来传输数据,我唯一能看到调用存储过程的地方是从 ADO NET 源任务中作为 SQL 命令查询,每次调用该过程时,它都会增加 ID,所以每次运行 SSIS 包时,它会更新 CRM 数据库中所有客户的 CustomerID 字段。

存储过程驻留在自定义 CRM 应用程序上。存储过程不接受任何输入参数。每次调用它时,它都会简单地输出一个标量值,如CT000001,等。CT000002

我还有哪些其他选择可以正确执行此操作?

4

1 回答 1

1

您需要使用脚本组件为每一行调用存储过程,并将值添加到下游到目标的管道中。

说明示例的示例 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 SourceScript Component (Transformation)ADO.NET 目标。

  • ADO.NET Source将从表dbo.ERP中读取数据

  • ADO.NET Destination将数据插入表dbo.CRM

脚本组件将涉及以下配置。

  • 双击脚本组件以打开脚本组件编辑器。

  • 点击Connection Managers标签页

  • 选择 ADO.NET 连接管理器ADONET_PracticeDB并将其命名为PracticeDB. 此连接管理器将在脚本组件代码中使用。

连接管理器

  • 点击Inputs and Outputs标签页

  • 输入ERP输出重命名为CRM

  • 展开 CRM,选择输出列并单击Add Column

  • 将列名称重命名为 CustomerID。该示例使用整数类型的列。您需要根据需要更改数据类型。

  • 点击Script标签页。

脚本组件

  • 在脚本标签页,单击Edit Script...

  • 键入以下脚本组件部分中显示的代码。该脚本使用包上可用的 ADO.NET 连接管理器启动连接,然后启动PreExecute方法内的命令对象。

  • 然后在ERP_ProcessInputRow方法中为管道中的每一行调用存储过程以生成新的客户 ID。

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());
    }
}

使用 C# 的脚本组件

  • 关闭脚本组件

  • 在执行包之前对数据执行以下查询以检查行。

表选择查询:

SELECT * FROM dbo.ERP;
SELECT * FROM dbo.CRM;
SELECT * FROM dbo.CustomerId;

执行前

首次执行包后,您会注意到已插入 4 行,并且成功调用了存储过程以添加客户 ID。

执行 1

在第二次执行包后,您可以注意到已经插入了 4 行,并且存储过程已成功增加客户 ID。

执行 2

希望能给你一个想法。

于 2013-02-20T20:41:02.273 回答