SSIS 派生列 - 是否有 trim 400 多个列的好方法?
SSIS Derived Column - Is there a good way to trim 400+ columns?
我从固定宽度的平面文件导入,它有 486 列。每一个都需要在进入数据库之前进行修剪。我知道派生列允许我一次做一个,但是有没有办法在列上做大量的 rtrim(ltrim(?
您可以使用两种方法(两种 BIML 方法都假设您已经收集了一些关于列名的元数据):
1 - 按脚本
这里还有两种方式:使用 InputBuffer,或使用 BIML by row。提供了输入缓冲区的功能,我相信您可以为该行创建自己的功能。
public class ScriptMain : UserComponent
{
private PipelineBuffer inputBuffer;
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)
{
// We need access to the PipelineBuffer which isn't exposed in ProcessInputRow
inputBuffer = Buffer;
base.ProcessInput(InputID, Buffer);
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
StripLeadingTrailingWhitespaceByInputBuffer(inputBuffer);
// Now for the BIML
<#
foreach (var column in table.Columns)
{
var colName = column.Name.ToString().Replace("_","");
#>
Row.<#= colName #> = StripLeadingTrailingWhitespaceByString(Row.<#= colName #>);
<#
}
}
#>
}
public void StripLeadingTrailingWhitespaceByInputBuffer(Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer inputBuffer)
{
for (int i = 0; i < inputBuffer.ColumnCount; ++i)
{
if (inputBuffer[i] != null)
inputBuffer[i] = inputBuffer[i].ToString().Trim();
}
}
}
2 - 派生列 BIML
foreach (var column in table.Columns)
{
var colName = column.Name;
#>
<DerivedColumns Name="(DCO) StripWhitespace">
<Columns>
<Column Name="derive_<#= colName #>" DataType="AnsiString" Length="255">StripWhitespace(<#= colName #>)</Column>
</Columns>
</DerivedColumns>
<#
}
#>
我从固定宽度的平面文件导入,它有 486 列。每一个都需要在进入数据库之前进行修剪。我知道派生列允许我一次做一个,但是有没有办法在列上做大量的 rtrim(ltrim(?
您可以使用两种方法(两种 BIML 方法都假设您已经收集了一些关于列名的元数据):
1 - 按脚本
这里还有两种方式:使用 InputBuffer,或使用 BIML by row。提供了输入缓冲区的功能,我相信您可以为该行创建自己的功能。
public class ScriptMain : UserComponent
{
private PipelineBuffer inputBuffer;
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
}
public override void ProcessInput(int InputID, Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer Buffer)
{
// We need access to the PipelineBuffer which isn't exposed in ProcessInputRow
inputBuffer = Buffer;
base.ProcessInput(InputID, Buffer);
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
StripLeadingTrailingWhitespaceByInputBuffer(inputBuffer);
// Now for the BIML
<#
foreach (var column in table.Columns)
{
var colName = column.Name.ToString().Replace("_","");
#>
Row.<#= colName #> = StripLeadingTrailingWhitespaceByString(Row.<#= colName #>);
<#
}
}
#>
}
public void StripLeadingTrailingWhitespaceByInputBuffer(Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer inputBuffer)
{
for (int i = 0; i < inputBuffer.ColumnCount; ++i)
{
if (inputBuffer[i] != null)
inputBuffer[i] = inputBuffer[i].ToString().Trim();
}
}
}
2 - 派生列 BIML
foreach (var column in table.Columns)
{
var colName = column.Name;
#>
<DerivedColumns Name="(DCO) StripWhitespace">
<Columns>
<Column Name="derive_<#= colName #>" DataType="AnsiString" Length="255">StripWhitespace(<#= colName #>)</Column>
</Columns>
</DerivedColumns>
<#
}
#>