如何在SSIS脚本组件行计数中包含表头行?
SSIS统计含表头总行数的问题
需求为统计包含表头行与所有数据行的总行数,将该数值存入变量后由Script Task写入文本文件。当前在Flat File Source转换之后、Flat File Destination之前放置了Script Component,通过PostExecute方法将rowNumber存入SSIS变量;同时用Script Task生成控制文件,但统计结果比实际总行数少1(实际132行,统计显示131行),需找到准确统计含表头所有行的方法。
现有Script Component代码
public class ScriptMain : UserComponent { private int rowNumber; public override void PreExecute() { base.PreExecute(); rowNumber = 0; } public override void PostExecute() { base.PostExecute(); Variables.MORTLRowCount = rowNumber; } public override void Input0_ProcessInputRow(Input0Buffer Row) { rowNumber++; Row.totalRows = rowNumber; } }
现有Script Task代码
public void Main() { int feedVersion = 200; string filename = (string)Dts.Variables["User::MortLCurrentFilename"].Value.ToString(); string ctlfilename = (string)Dts.Variables["User::MORTLCtlDestinationFileName"].Value.ToString() ; int recordCount = (int)Dts.Variables["User::MORTLRowCount"].Value ; string firstline = "Filename | Feed Version | Record Count"; string secondline = filename + "|" + feedVersion + "|" + recordCount; string filetext = firstline + System.Environment.NewLine + secondline; System.IO.File.WriteAllText(ctlfilename, filetext); Dts.TaskResult = (int)ScriptResults.Success; }
问题原因与解决方法
问题根源在于:Flat File Source默认会跳过表头行,Script Component的Input0_ProcessInputRow方法仅统计了数据行数量,因此最终结果比包含表头的总行数少1。以下是三种解决方式:
方式一:Script Task中直接给统计值加1
如果确认表头固定为1行,可直接在Script Task中修改统计值:
// 替换原recordCount赋值行 int recordCount = (int)Dts.Variables["User::MORTLRowCount"].Value + 1;
方式二:修改Script Component的初始值
将Script Component中rowNumber的初始值设为1(代表表头行),后续数据行累加后即为总行数:
// 修改PreExecute方法 public override void PreExecute() { base.PreExecute(); rowNumber = 1; // 初始值设为1,对应表头行 }
方式三:直接读取源文件总行数
若担心数据转换过程中存在行过滤等情况导致统计不准确,可直接读取源文件的总行数,在Script Task中实现:
// 替换原recordCount的赋值逻辑 string sourceFilePath = (string)Dts.Variables["User::MortLCurrentFilename"].Value; int recordCount = System.IO.File.ReadAllLines(sourceFilePath).Length;
内容的提问来源于stack exchange,提问作者SidC
相关产品推荐
相关产品推荐

