1

私は .Net と SQL に興味があり、フラット ファイルからデータを取得して SQL テーブルに入力する SSIS パッケージに取り組んでいます。支援が必要な部分は、ファイルの更新日を取得し、そのテーブルで作成した派生列にデータを入力することです。ファイルのパスとして、DateTime 型の FileDate、String の FilePath、および String の SourceFolder という変数を作成しました。スクリプト コンポーネントを使用して、DataFlow を使用して派生列に DateModified を入力できると考えていましたか? 私が正しい軌道に乗っているかどうか、誰かがアドバイスしてもらえますか? 助けていただければ幸いです。ありがとう。

4

1 に答える 1

2

派生列変換は、 Integration Servicesの式でのみ機能します。スクリプト タスクを使用すると、.net ライブラリにアクセスできます。@wil が親切に投稿したメソッドを使用するか、System.IO.Fileの静的メソッドを使用することをお勧めします。

ただし、データ フロー タスクでこれを行いたいとは思わないでしょう。SSIS は、ファイルから流れるすべての行に対してそのコードを評価する必要があります。半関連のメモでは、... イベントが発生してデータフローが完了したことを通知するまで変数に書き込むことはできません (OnPostExecute だと思いますが、引用しないでください)。いずれにせよ、下流の派生列の変数。もちろん、データ パイプラインを変更して、その時点でファイルの変更日を挿入するだけです。

おそらくあなたの意図は、データ フロー タスクの前にスクリプト タスクを使用して、値を FileDate 変数に割り当てることです。データ フロー内で、派生列を使用して @FileDate 変数をパイプラインに追加します。

// This code is approximate. It should work but it's only been parsed by my brain
// 
// Assumption: 
// SourceFolder looks like a path   x:\foo\bar 
// FilePath looks like a file name  blee.txt
// SourceFolder [\] FilePath is a file that the account running the package can access
// 
// Assign the last mod date to FileDate variable based on file system datetime
// Original code, minor flaws
// Dts.Variables["FileDate"].Value = File.GetLastWriteTime(System.IO.Path.Combine(Dts.Variables["SourceFolder"].Value,Dts.Variables["FilePath"].Value));
Dts.Variables["FileDate"].Value = System.IO.File.GetLastWriteTime(System.IO.Path.Combine(Dts.Variables["SourceFolder"].Value.ToString(), Dts.Variables["FilePath"].Value.ToString()));

編集

コードまたは変数のいずれかに問題があると思います。FilePath と SourceFolder の値は、私の値とほぼ一致していますか? 変数は大文字と小文字が区別されますが、報告されたエラーを考えると、それが問題になるとは思いません。

これは完全なスクリプト タスクであり、以下のスクリーンショットで確認できます。FileDate のデザイン時の値は 2011-10-05 09:06 です。これは、c:\tmp\witadmin.txt ファイルの最終更新日です。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_f74347eb0ac14a048e9ba69c1b1e7513.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };

        public void Main()
        {
            Dts.Variables["FileDate"].Value = System.IO.File.GetLastWriteTime(System.IO.Path.Combine(Dts.Variables["SourceFolder"].Value.ToString(), Dts.Variables["FilePath"].Value.ToString()));
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

ここに画像の説明を入力

C:\tmp>dir \tmp\witadmin.txt
 Volume in drive C is Local Disk
 Volume Serial Number is 3F21-8G22

 Directory of C:\tmp

09/23/2011  09:26 AM           670,303 witadmin.txt
于 2011-10-05T01:54:53.617 に答える