BIML SsisDataTypeOverride不起作用

时间:2017-12-13 20:44:57

标签: c# ssis biml

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>

2 个答案:

答案 0 :(得分:2)

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

Derived Column Type Change

虽然我没有2005年的实例进行测试,但我相信这个功能在第一次迭代时确实存在,但在2012年被删除。

答案 1 :(得分: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>