使用文件的修改日期填充派生列

时间:2011-10-04 19:47:33

标签: ssis derived

我非常想要.Net和SQL,我正在开发一个SSIS包,它从平面文件中提取数据并将其输入到SQL表中。我需要帮助的部分是获取文件的修改日期并填充我在该表中创建的派生列。我创建了以下变量:DateTime类型的FileDate,String的FilePath和文件路径的String的SourceFolder。我以为可以使用脚本组件在DataFlow的派生列中填充DateModified?有人可以告诉我,我是否走在正确的轨道上?我感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:2)

Derived Column Transformation只能与Integration Services Expressions一起使用。脚本任务允许您访问.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运行时间值(本地人)是2011-09-23 09: 26:59这是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;
        }
    }
}

enter image description here

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