Visual studio 2010 如何获取存储过程标量输出并将其添加到管道中的每一行?

Visual studio 2010 如何获取存储过程标量输出并将其添加到管道中的每一行?,visual-studio-2010,ssis,sql-server-2012,Visual Studio 2010,Ssis,Sql Server 2012,我正在使用SSIS包将数据从ERP系统(Microsoft Dynamics AX)传输到自定义CRM解决方案。我需要转移/更新的内容之一是客户。在CRM系统中,有一个名为CustomerID的字段,该字段是CRM环境特有的,并且在数据从ERP系统传输到CRM系统时必须设置该字段 问题是我必须调用一个存储过程来获取下一个要插入的客户的CustomerID。如何从SSIS内部执行此操作?我目前正在使用数据流传输数据,唯一可以调用存储过程的地方是作为SQL命令查询的ADO NET源任务,每次调用该过

我正在使用SSIS包将数据从ERP系统(Microsoft Dynamics AX)传输到自定义CRM解决方案。我需要转移/更新的内容之一是客户。在CRM系统中,有一个名为CustomerID的字段,该字段是CRM环境特有的,并且在数据从ERP系统传输到CRM系统时必须设置该字段

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

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


正确执行此操作的其他选项有哪些?

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

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源代码
    脚本组件(转换)
    和ADO.NET目标

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

  • ADO.NET目标将向表dbo.CRM中插入数据

脚本组件将涉及以下配置

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

  • 单击连接管理器选项卡页面

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

  • 单击输入和输出选项卡页面

  • 将输入重命名为
    ERP
    ,并将输出重命名为
    CRM

  • 展开CRM,选择输出列,然后单击添加列

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

  • 单击
    Script
    选项卡页面

  • 在脚本选项卡页面上,单击编辑脚本…

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

  • 然后在
    ERP\u ProcessInputRow
    方法中为管道中的每一行调用存储过程,以生成新的客户ID

用C编写组件代码#

  • 关闭脚本组件

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

表选择查询:

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

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


希望这能给你一个想法。

CRM能转化为MS Dynamics吗?@billinkc不,不能。它不是Dynamics CRM。@Siva-ERP是Microsoft Dynamics AX,CRM是一个定制的内置CRM。@Siva-在CRM方面是。存储的过程更新包含最新客户编号的表,并返回值。通常,数字类似于CT000001,CT000002,etc@Siva它不需要输入参数。输出为CT000001、CT000002等。
#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;