スクリプトコンポーネントを使用して各行のストアドプロシージャを呼び出し、宛先の下流のパイプラインに値を追加する必要があります。
サンプルを示すサンプル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());
}
}

テーブル選択クエリ:
SELECT * FROM dbo.ERP;
SELECT * FROM dbo.CRM;
SELECT * FROM dbo.CustomerId;

パッケージを最初に実行した後、4つの行が挿入され、ストアドプロシージャが正常に呼び出されて顧客IDが追加されたことがわかります。

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

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