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