SSIS内で複数の入力を受け付けるスクリプトコンポーネントを作成する方法を探しています。複数の入力を持つSSISスクリプトコンポーネント
私はカスタム結合のフォームを行うことができますので、これが必要です。
スクリプトは複数の出力を持つことができますが、入力は1つしかないと私は間違っていると思います。
助けが必要ですか?
SSIS内で複数の入力を受け付けるスクリプトコンポーネントを作成する方法を探しています。複数の入力を持つSSISスクリプトコンポーネント
私はカスタム結合のフォームを行うことができますので、これが必要です。
スクリプトは複数の出力を持つことができますが、入力は1つしかないと私は間違っていると思います。
助けが必要ですか?
スクリプトコンポーネントの前にUnion Allコンポーネントを置いて、列が一致するのではなく、入ってくる各要素が一意の列になるように列を出力に追加してください。
最初にSSISスクリプトコンポーネントは行単位でアイテムを処理するため、一部のコレクションを使用してカスタム結合メカニズムを実行し、すべての行が処理された後に発生するイベントをキャプチャする必要があります。
私はあなたがデータフローではなく制御フローでスクリプトコンポーネントを使用していると仮定していること、そして私はあなたが私 "メートルSSIS 2005年に
を使用していると仮定していますのでご注意ください複数のスクリプトコンポーネントを使用してさまざまな入力を受け入れてから、System.Threadingクラスを使用して1つのスクリプトコンポーネントの渡し値を同期させることができます
ハードルは、各スクリプトがそれ自身の名前空間にあり、他のスクリプトとクラスを共有できないことです(をコンパイルしない限り)。SSISを使用して独自のアセンブリを展開します)。私が現在やっているのは、(共有変数を介して)ManualResetEvent、SSIS PipelineBuffer、およびパイプライン列インデックスの配列への参照を含むオブジェクト[]への参照を渡すことです。
これは、受信側のスクリプトがもう一方のスクリプトの入力パイプラインを再構築し、それを乾燥させてから、完了したことを伝えるのに十分です。
私は現在、SSISがスクリプトコンポーネントの有効期間中に2回「ProcessInput」を呼び出すという事実を回避する方法を探していますが、機能的です。ここにいる天才のどれかが解決策を持っていれば、私たちは単一のスクリプトコンポーネントに複数の入力を可能にするための[不器用な]解決策を得ていると思います。
任意の受取人ですか?
---- EDIT ----
Iが稼働し、これを持っている - このトリックは、入力バッファ番目mulitple回を共有しようとするからProcessInputののマルチスレッド呼び出しを防ぐためのsyncronizationを使用することです。以下は、私はこの作業を得た方法の粗製のコードサンプルです:
スクリプトコンポーネント1:株式、それは入力です...
using System;
using System.Collections;
using System.Threading;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using Microsoft.SqlServer.Dts.Pipeline;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
System.Collections.Generic.List<object> shared = null;
System.Threading.ManualResetEvent sync;
public override void ProcessInput(int InputID, PipelineBuffer Buffer)
{
lock (this)
{
if (InputID == 82)
{
if (shared == null)
{
shared = new System.Collections.Generic.List<object>();
sync = new System.Threading.ManualResetEvent(false);
shared.Add(sync);
shared.Add(Buffer);
shared.Add(GetColumnIndexes(InputID));
IDTSVariables100 vars = null;
this.VariableDispenser.LockOneForWrite("Test", ref vars);
vars[0].Value = shared;
vars.Unlock();
sync.WaitOne();
System.Windows.Forms.MessageBox.Show("Done");
}
}
}
}
}
...(スクリプトコンポーネント1の入力を消費)その後、スクリプトコンポーネント2。 ..
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
System.Threading.ManualResetEvent sync = null;
InputXBuffer sharedBuffer = null;
public override void Input0_ProcessInput(Input0Buffer Buffer)
{
lock (this) // Only 1 thread at a time
{
if (sharedBuffer == null)
{
object Test = null;
while (Test == null)
{
System.Threading.Thread.Sleep(100);
IDTSVariables100 vars = null;
this.VariableDispenser.LockOneForRead("Test", ref vars);
Test = vars[0].Value;
vars.Unlock();
}
var sharedList = Test as System.Collections.Generic.List<object>;
if (sharedList != null)
{
sync = sharedList[0] as System.Threading.ManualResetEvent;
var buffer = sharedList[1] as PipelineBuffer;
var bufferColumnIndexes = sharedList[2] as int[];
sharedBuffer = new InputXBuffer(buffer, bufferColumnIndexes);
}
}
}
while (sharedBuffer.NextRow())
{
// ... do stuff with Script Component 1's shared input here...
}
sync.Set(); // Signal script 1 that we're done
}
}
スクリプトの「テスト」と呼ばれる読み取り/書き込み変数を共有し、両方 - あなたのニーズに合った変数名を変更することができます。うまくいけば、上記はあなたを次のレベルに引き上げるための作業モデルとして役立ちます。
PS:時間が&の場合、適切なカスタムSSISコンポーネントを作成することは、実際にはマルチ入力シナリオのための方法です。
回答ありがとうございます。私は各レコードのタイプを定義し、それらを結合します。それらを渡してコレクションを使用し、結合して出力します。 –
コレクションに行を格納するためのコードサンプルの指示に私を指摘できないとしますか? –