【发布时间】:2018-09-11 17:39:36
【问题描述】:
我正在使用数据流任务连接到 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# ssis synchronous script-component