首页 > 解决方案 > SSIS 脚本组件目标 - 将表数据拆分到多个文件

问题描述

我正在使用数据流任务连接到 oledb 源并运行产生数百万行的 sql 代码。每行都是一个 xml 内容,只有一列 (nvarchar(max))。我将它连接到脚本组件目标,原因是当行数达到 10k 时,我想停止并写入另一个文件。

当我使用断点时它工作正常,所以如果有 100 行并且我希望每个文件中有 10 行,当我使用断点时它会生成 10 个文件。但是,当我在没有断点的情况下运行 pacakge 时,它​​会创建随机数量的文件。例如:它创建 6 个文件,其中 3 个包含 10 行,其余 70 个被拆分到其他文件中。

我通读了文档和博客,看看输入缓冲区是否是同步的,看起来是这样。即每行一次处理一个,至少这是我的理解,所以我不确定这个问题的根本原因是什么?有人可以阐明一下。下面是我用来在 Script Componenet 中拆分文件的代码

 [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
 StreamWriter writer;
    int rowCount = 0;
    int rowLimit = 50;
    String RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt"; 
    public override void PreExecute()
    {
        base.PreExecute();
        writer = new System.IO.StreamWriter(RunFileName, true);
        rowCount = 0;
    }
    public override void PostExecute()
    {
        base.PostExecute();
        writer.Dispose(); 
    }
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        if (rowCount == rowLimit)
        {
            writer.Dispose();
            rowCount = 0;
            RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";
            writer = new System.IO.StreamWriter(RunFileName, true);
        }
        var data = System.Text.Encoding.Unicode.GetString(Row.XMLInnerText.GetBlobData(0, Convert.ToInt32(Row.XMLInnerText.Length)));
        writer.WriteLine(data);
        rowCount++; 
    }
}

标签: c#ssissynchronousscript-component

解决方案


对不起,如果我浪费了任何人的时间。问题是因为我创建文件名的方式,它开始附加到同一个文件。

RunFileName = "C:\\Users\\Desktop\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".txt";

推荐阅读