You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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>

关键检查项

  1. 看脚本里的行号变量是不是在ProcessInputRow方法外面声明的——这是保证计数不重置的核心。
  2. 确认BIML里<Input>和<Output>的配置:输入列要正确同步,输出列的DataType要和test_np_02里的行号列类型一致。
  3. 检查SynchronousInputName是否设成了输入名称(比如示例里的Input0),确保是同步转换,和手动创建的数据流逻辑对齐。
  4. 生成包后,打开SSIS包对比手动版本的Script Component:看看输入列有没有勾选、脚本逻辑是不是和手动写的一样、输出列映射有没有问题。

要是还是不行,就把生成的包和手动做的包逐行对比配置,肯定能找到差异点。

内容的提问来源于stack exchange,提问作者user9660395

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:59