1

ssis 中的数据转换任务不允许重用现有列以轻松自动映射到目标。

所以我编写了一个 foreach 列并评估了数据类型,将其动态添加到列集合中。

我注意到 DataType 和 Length 是必需的,但是它们对 ReplaceExisting=true 没有影响。

有没有人找到一种方法来强制使用 biml 在派生任务中转换新数据类型?

这不起作用。

在生成 SSIS 包时,使用 (DT_WSTR,length) 转换列确实会出现,但不会更改派生任务中为该列定义的数据类型。

<DerivedColumns Name="der_conversions">
<Columns>
    <# 
    foreach(var column in table.Columns)
    {
        if(column.DataType == System.Data.DbType.AnsiString)
        {
    #> 
    <!-- the DataType and Length are required however they have no effect for ReplaceExisting=true -->
    <Column  ReplaceExisting="true" Name="<#=column.Name#>" DataType="String" SsisDataTypeOverride="DT_WSTR" Length="<#=column.Length#>"><#=column.Name#></Column>  
    <#  
        }//endif 
    }//endforeach
    #>
</Columns>

4

2 回答 2

2

如果您选择了替换现有列,则派生列组件无法更改数据类型。在下面的示例中,我的列TABLE是 unicode 字符串,长度为 255。在第一行中,我将类型显式更改为非 unicode 字符串,并观察到数据类型仍然是 DT_WSTR 255。应用于新列的相同公式正确更改方式。如果我用列引用替换了 ABC 的静态字符串,(DT_STR, 255, 1252) [TABLE]我会看到相同的结果 - 更改了数据类型。

派生列类型更改

虽然我没有要测试的 2005 实例,但我相信此功能在第一次迭代中确实存在,但在 2012 年被删除。

于 2017-12-13T22:56:48.827 回答
1

最终在 oledb 目标中使用具有动态规则的数据转换任务

<OleDbDestination Name="oledb_dst_<#=table.Name#>" ConnectionName="cmgr_zaprisque_dvar"  KeepIdentity="true">
                                <ExternalTableOutput Table="<#=table.Schema.Name#>.<#=table.Name#>" />
                                <Columns>
                                <# 
                                    foreach(var column in table.Columns)
                                    {
                                        if(column.DataType == System.Data.DbType.AnsiString)
                                        {
                                    #> 
                                    <!-- the DataType and Length are required however they have no effect for ReplaceExisting=true -->
                                    <Column SourceColumn="<#=column.Name#>_conv" TargetColumn="<#=column.Name#>"/> 
                                    <#  
                                        }//endif 
                                        else
                                        {#> 
                                          <Column SourceColumn="<#=column.Name#>" TargetColumn="<#=column.Name#>"/> 
                                        <# }

                                    }//endforeach
                                    #>
                                </Columns>

                                </OleDbDestination>
于 2017-12-13T21:04:55.373 回答