使用BIML <ScriptComponentProject>生成数据流失败,手动构建正常求助
解决BIML生成Script Component时行号计算失效的问题
嘿,我之前也碰到过一模一样的情况——手动搭的数据流能正常生成连续行号存到test_np_02,但用BIML的<ScriptComponentProject>生成后就掉链子。下面是我总结的常见问题点和修复方案,你可以对照着排查:
最可能的几个原因
- 行号变量的作用域错了:手动写脚本时你肯定把行号变量放在了类级(全局),但BIML生成的脚本如果不小心把变量塞进
ProcessInputRow方法里,那每处理一行变量都会重置,自然出不来连续的数字。 - 列映射/同步没配置对:手动创建时默认会同步输入列,但BIML里如果没明确指定输入输出列的映射,脚本可能没法正确触发每行的处理逻辑,行号自然就不会累加。
- Script Component的类型没设对:得确保是Transformation类型的组件,要是误设成Source或Destination,数据流的执行逻辑就和手动版本不一样了。
能用的修复示例BIML代码
我把能正常生成连续行号的BIML模板贴给你,你可以对比自己的代码调整:
<Biml xmlns="http://schemas.varigence.com/biml.xsd"> <Packages> <Package Name="PKG_Generate_RowNumber" ConstraintMode="Linear"> <Tasks> <Dataflow Name="DFT_RowNumber"> <Transformations> <!-- 替换成你的实际数据源 --> <OleDbSource Name="SRC_Source" ConnectionName="Your_DB_Connection"> <DirectInput>SELECT * FROM Your_Source_Table</DirectInput> </OleDbSource> <!-- 生成行号的Script Component --> <ScriptComponentProject Name="SCN_RowNumber" ScriptLanguage="CSharp"> <Inputs> <Input Name="Input0"> <!-- 同步所有输入列,也可以指定具体列 --> <Columns> <Column SourceColumn="*" /> </Columns> </Input> </Inputs> <Outputs> <Output Name="Output0" SynchronousInputName="Input0"> <!-- 添加行号输出列,类型要和目标表匹配 --> <Columns> <Column Name="RowNumber" DataType="Int32" /> </Columns> </Output> </Outputs> <ScriptComponentProjectFiles> <File Path="ScriptMain.cs"> using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { // 类级变量,跨行保留计数 private int rowCounter = 0; public override void PreExecute() { base.PreExecute(); // 初始化计数器 rowCounter = 0; } public override void Input0_ProcessInputRow(Input0Buffer Row) { rowCounter++; // 给输出列赋值 Row.RowNumber = rowCounter; } } </File> </ScriptComponentProjectFiles> </ScriptComponentProject> <!-- 目标表test_np_02 --> <OleDbDestination Name="TGT_Test" ConnectionName="Your_DB_Connection"> <ExternalTableOutput Table="test_np_02" /> <InputPaths> <InputPath OutputPathName="SCN_RowNumber.Output0" /> </InputPaths> <Mappings> <!-- 映射所有需要的列,包括RowNumber --> <Mapping SourceColumn="*" DestinationColumn="*" /> </Mappings> </OleDbDestination> </Transformations> </Dataflow> </Tasks> </Package> </Packages> </Biml>
关键检查项
- 看脚本里的行号变量是不是在
ProcessInputRow方法外面声明的——这是保证计数不重置的核心。 - 确认BIML里
<Input>和<Output>的配置:输入列要正确同步,输出列的DataType要和test_np_02里的行号列类型一致。 - 检查
SynchronousInputName是否设成了输入名称(比如示例里的Input0),确保是同步转换,和手动创建的数据流逻辑对齐。 - 生成包后,打开SSIS包对比手动版本的Script Component:看看输入列有没有勾选、脚本逻辑是不是和手动写的一样、输出列映射有没有问题。
要是还是不行,就把生成的包和手动做的包逐行对比配置,肯定能找到差异点。
内容的提问来源于stack exchange,提问作者user9660395
相关产品推荐
相关产品推荐

