在 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>
我正在使用 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>