【问题标题】:How to get a stored procedure scalar output and add it to each row in the pipeline?如何获取存储过程标量输出并将其添加到管道中的每一行?
【发布时间】:2013-02-20 18:52:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • CRM 是否转换为 MS Dynamics?
  • @billinkc 不,它没有。它不是 Dynamics CRM。
  • @Siva - ERP 是 Microsoft Dynamics AX,CRM 是内部定制的。
  • @Siva - 在 CRM 方面是的。存储过程更新保存最新客户编号的表,并返回该值。通常,数字类似于 CT000001、CT000002 等
  • @Siva 它不需要输入参数。输出为CT000001、CT000002等

标签: visual-studio-2010 ssis sql-server-2012


【解决方案1】:

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

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

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

  • 关闭脚本组件

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

表选择查询:

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

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

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

希望能给你一个想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多