在 SSIS 中使用迭代次数

Use Iteration number in SSIS

我正在使用 SSIS 将平面文件中的数据加载到 SQL 服务器数据库中。

加载时,我加载了一个名为 "Iteration" 的列。每插入 100 行,此列的值应递增。例如,

+----------------+-------+
| Columns        | Iter  |
+----------------+-------+
| First 100 rows | 0     |
+----------------+-------+
| Next 100 rows  | 1     |
+----------------+-------+
| Next 100 rows  | 2     |
+----------------+-------+

由于我是 SSIS 新手,所以我不知道该怎么做。我尝试将 counter 与变量一起使用。但没有工作。这在 SSIS 中可行吗?

在您的包中添加一个名为 IterationSize 的变量,整数并将其初始化为您的 100。如果批量大小发生变化,让我们在一个简单、明显的地方进行更改。

脚本任务,执行转换就是您要找的。我们将配置该任务,使其具有对名为 IterationSize

的 SSIS 变量的读取权限

并且在 Inputs Outputs 选项卡中,我们需要将名为 Iteration 的新列添加到 Output 0 缓冲区的 Output Columns 集合中。默认类型 DT_I4 可以

代码本身很小。我们将创建一个名为 currentRowNumber 的成员变量并将其初始化为零。随着每一行进入组件,我们将增加一。在此之前,我们将为新列分配一个值,该值将 currentRowNumber 除以我们的 SSIS 变量 User::IterationSize

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
{
    int currentRowNumber;

    public override void PreExecute()
    {
        base.PreExecute();
        this.currentRowNumber = 0;
    }


    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        // integer division is free truncation. Not testing for iterationsize of zero
        Row.Iteration = this.currentRowNumber / Variables.IterationSize;
        this.currentRowNumber++;
    }

}

为了测试,我创建了一个文件,该文件只有一列,始终为数字零,并且有 206 行。我将迭代大小设置为 3,并将数据查看器放入我的数据流中。您可以看到前三行是迭代 0,接下来的三行是迭代 1,等等

编译它

获取 Visual Studio 的免费 BimlExpress 插件,下面的 Biml 应该完全重新创建我的包。嗯,差不多。实际代码出了点问题,但我必须回来修复它。 + 提交错误报告

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <FlatFileConnection Name="Flat File Connection Manager" FilePath="C:\ssisdata\Input\so_61794511.txt" FileFormat="Flat File Connection Manager" />
    </Connections>
    <Packages>
        <Package Name="SO_61794511" Language="None" ConstraintMode="LinearOnCompletion">
            <Variables>
                <Variable Name="IterationSize" DataType="Int32" IncludeInDebugDump="Include">7</Variable>
            </Variables>
            <Tasks>
                <Dataflow Name="DFT Ingest file">
                    <Transformations>
                        <FlatFileSource Name="FFS Data" LocaleId="None" RetainNulls="true" FileNameColumnName="" ConnectionName="Flat File Connection Manager" />
                        <ScriptComponentTransformation Name="SCR Segment data" ProjectCoreName="SC_c69eec20ae0540169ee55fafada9521b">
                            <ScriptComponentProjectReference ScriptComponentProjectName="SC_c69eec20ae0540169ee55fafada9521b" />
                        </ScriptComponentTransformation>
                        <DerivedColumns Name="Place holder" />
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
    <FileFormats>
        <FlatFileFormat Name="Flat File Connection Manager" CodePage="1252" TextQualifier="_x003C_none_x003E_" RowDelimiter="">
            <Columns>
                <Column Name="Data" Length="50" DataType="AnsiString" Delimiter="CRLF" MaximumWidth="50" />
            </Columns>
        </FlatFileFormat>
    </FileFormats>
    <ScriptProjects>
        <ScriptComponentProject Name="SC_c69eec20ae0540169ee55fafada9521b" ProjectCoreName="SC_c69eec20ae0540169ee55fafada9521b">
            <ReadOnlyVariables>
                <Variable VariableName="IterationSize" DataType="Int32" Namespace="User" />
            </ReadOnlyVariables>
            <OutputBuffers>
                <OutputBuffer Name="Output 0">
                    <Columns>
                        <Column Name="Iteration" />
                    </Columns>
                </OutputBuffer>
            </OutputBuffers>
            <InputBuffer Name="Input 0" />
        </ScriptComponentProject>
    </ScriptProjects>
</Biml>