1

フラット ファイルを受け取り、そのコンテンツをステージング テーブルにロードする SSIS パッケージのセットアップに忙しくしています。そこから、そのファイルのファイル名を取得し、データ行の 1 つと共に別のテーブルのフィールドに保存する必要があります。ストアド プロシージャを実行する SQL 実行タスクを使用して行うデータの読み込み。この手順では、ファイル名を入力パラメーターとして受け取ります (そのテーブルに書き込むことができるようにするためです)... SQL タスクを実行する前に、次のことを行うスクリプト タスクを追加しました。

public void Main()
        {
            string inputFolder;
            string fileName;

            inputFolder = Dts.Variables["SourceFolder"].Value.ToString();
           // MessageBox.Show(inputFolder);

            string[] foundFiles = null;
            foundFiles = System.IO.Directory.GetFiles(inputFolder);

            if (foundFiles.Length > 0)
            {
                fileName = foundFiles[0];

                Dts.Variables["ProcessedFileName"].Value = System.IO.Path.GetFileName(fileName);
//                MessageBox.Show(fileName);

               // MessageBox.Show(System.IO.Path.GetFileName(fileName));

            }

            Dts.TaskResult = (int)ScriptResults.Success;
        }

"ProcessedFileName" 変数は、"SourceFolder" 変数と同様に、SSIS パッケージのグローバル変数です。

直接入力実行を使用して設定した実行 SQL タスク:

DECLARE @StoredProcedure varchar(100) = ?;
DECLARE @ProcessedFileName varchar(100) = ?;

EXEC ? ?;

パラメータ マッピングは、変数 StoredProcedure および ProcessedFileName に対するものです。

問題は、これを実行すると、「1 つ以上の必須パラメーターに値が指定されていません」と表示されることです。これはなぜですか?

4

1 に答える 1

1

パラメータを使用して SQL 実行タスクのストアド プロシージャ名を動的に変更することはできません。それがEXEC ? ?;やっていることです。

実行時にプロシージャ名を変更する必要がある場合は、式を介して文字列連結を使用してクエリを作成する必要があります。

全体像を見ると、For Each (ファイル) Enumeratorタスクで十分なスクリプト タスクを使用しているようです。foreach でスクリプト タスクを使用する理由はいくつかありますが (たとえば、順番に処理する必要がある場合など)、それを行っているようには読み取れません。

式と foreach 列挙子を達成する方法に役立つさまざまな回答

于 2012-07-26T12:23:36.333 に答える