0

ERP システム ( Microsoft Dynamics AX ) からカスタム CRM ソリューションにデータを転送する SSIS パッケージに取り組んでいます。転送/更新する必要があるものの 1 つは顧客です。CRM システムには、CRM 環境に固有の CustomerID というフィールドがあり、データが ERP システムから CRM システムに転送されるときに設定する必要があります。

問題は、ストアド プロシージャを呼び出して、次の顧客を挿入するための CustomerID を取得する必要があることです。SSIS内からこれを行うにはどうすればよいですか? 私は現在、データ フローを使用してデータを転送しています。ストアド プロシージャを呼び出す唯一の場所は、SQL コマンド クエリとして ADO NET ソース タスク内からであり、プロシージャが呼び出されるたびに ID がインクリメントされるため、 SSIS パッケージを実行すると、CRM データベース内のすべての顧客の CustomerID フィールドが更新されます。

ストアド プロシージャは、カスタム CRM アプリケーション上にあります。ストアド プロシージャは入力パラメータを受け入れません。呼び出されるたびCT000001に、 などのスカラー値を出力するだけです。CT000002

これを適切に行うための他のオプションは何ですか?

4

1 に答える 1

1

スクリプトコンポーネントを使用して各行のストアドプロシージャを呼び出し、宛先の下流のパイプラインに値を追加する必要があります。

サンプルを示すサンプルSSIS2012パッケージ:

サンプルでは、​​次のデータベースオブジェクトを使用しています。

  • PracticeDBという名前のSQLServer2012データベース。このシナリオでは、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.NETDestinationをドラッグアンドドロップしADO.NET SourceますScript Component (Transformation)

  • ADO.NETソースはテーブル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

パッケージを2回実行すると、さらに4行が挿入され、ストアドプロシージャが顧客IDを正常にインクリメントしたことがわかります。

実行2

それがあなたにアイデアを与えることを願っています。

于 2013-02-20T20:41:02.273 に答える