表达式的 SSIS BIML 派生列语法

SSIS BIML Derived Column syntax for expressions

我在 BIML 中定义派生列转换,但在我的派生列转换中引用前一个 Excel 源的输出时遇到问题。

我在成功生成 SSIS 包后打开包时收到错误消息,它表明派生转换无法找到 Excel 源的输出。

Error 2 Error loading AFR_ShareTableBIML.dtsx: The object "/DTS:Executable/DTS:Executables/DTS:Executable/DTS:ObjectData/pipeline/components/component/inputs/input/inputColumns/inputColumn/properties/property" references ID "#{Package\Data Flow {Import Share Table CSV}\Source {Flat File Share Table}.Outputs[Output].Columns[Div c per share]}", but no object in the package has this ID.

这是一个代码片段:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<FileFormats>
    <FlatFileFormat Name="FFF_AFRShareTable" ColumnNamesInFirstDataRow="true"
            FlatFileType="Delimited" IsUnicode="false" TextQualifer="None" HeaderRowsToSkip="6">
        <Columns>
            <Column Name="Quote Buy" ColumnType="Delimited" DataType="AnsiString" Length ="50" Delimiter=","></Column>
            <Column Name="Quote Sell" ColumnType="Delimited" DataType="AnsiString" Length ="50" Delimiter=","></Column>
            <Column Name="Div c per share" ColumnType="Delimited" DataType="AnsiString" Length ="50" Delimiter=","></Column>
        </Columns>
    </FlatFileFormat>
</FileFormats>
<Connections>
    <FlatFileConnection Name="FF_AFRShareTable" FileFormat="FFF_AFRShareTable"
        FilePath="C:\Temp\Stocks.csv"></FlatFileConnection>
    <OleDbConnection Name="CMD DB"
        ConnectionString="Data Source=Localhost;Initial Catalog=DB;Provider=SQLNCLI11.1;Integrated Security=SSPI;" CreateInProject="true">
    </OleDbConnection>
</Connections>
<Packages>
    <Package Name="AFR_ShareTableBIML" ConstraintMode="Linear" ProtectionLevel="DontSaveSensitive">
        <Tasks>
            <ExecuteSQL Name="SQLTask {OLE_DB} Truncate Security Share Table" ConnectionName="CMD DB">
                <DirectInput>truncate table Staging.SecurityShareTable</DirectInput>
            </ExecuteSQL>
            <Dataflow Name="Data Flow {Import Share Table CSV}">
                <Transformations>
                    <FlatFileSource Name="Source {Flat File Share Table}" ConnectionName="FF_AFRShareTable"></FlatFileSource>
                    <DerivedColumns Name="DER_NullifyColumns">
                        <Columns>
                            <Column Name ="DER_DPS" DataType = "Decimal" Precision="4">
                                [Div c per share] == "-" ? NULL(DT_DECIMAL, 4)  : (DT_DECIMAL, 4)[Div c per share]
                            </Column>
                        </Columns>
                    </DerivedColumns>
                </Transformations>
            </Dataflow>
        </Tasks>
    </Package>
</Packages>

我已经通过 FlatFileFormat 定义了列名称,并且我已经确认 DER_DPS 列中的表达式在语法上是正确的。我发现把方括号“[”和“]”换成双引号,就可以打开SSIS包了。例如:

"Div c per share" == "-" ? NULL(DT_DECIMAL, 4)  : (DT_DECIMAL, 4) "Div c per share"

但是,语法不正确会导致派生列转换错误。方括号是 BIML 中需要转义的特殊字符吗?

那是……有趣。

您在组件名称中使用大括号似乎导致 Biml 扩展失控。

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <FileFormats>
        <FlatFileFormat Name="FFF_AFRShareTable" ColumnNamesInFirstDataRow="true"
                FlatFileType="Delimited" IsUnicode="false" TextQualifer="None" HeaderRowsToSkip="6">
            <Columns>
                <Column Name="Quote Buy" ColumnType="Delimited" DataType="AnsiString" Length ="50" Delimiter=","></Column>
                <Column Name="Quote Sell" ColumnType="Delimited" DataType="AnsiString" Length ="50" Delimiter=","></Column>
                <!-- Change -->
                <Column Name="Div c per share" ColumnType="Delimited" DataType="AnsiString" Length ="50" Delimiter="CRLF"></Column>
            </Columns>
        </FlatFileFormat>
    </FileFormats>
    <Connections>
        <FlatFileConnection Name="FF_AFRShareTable" FileFormat="FFF_AFRShareTable"
            FilePath="C:\ssisdata\so\input\Stocks.csv"></FlatFileConnection>
        <OleDbConnection Name="CMD DB"
            ConnectionString="Data Source=Localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;" 
            CreateInProject="false">
        </OleDbConnection>
    </Connections>
    <Packages>
        <Package Name="so_37641290_AFR_ShareTableBIML" ConstraintMode="Linear" ProtectionLevel="DontSaveSensitive">
            <Tasks>
                <ExecuteSQL Name="SQLTask OLE_DB Truncate Security Share Table" ConnectionName="CMD DB">
                    <DirectInput>truncate table Staging.SecurityShareTable</DirectInput>
                </ExecuteSQL>
                <Dataflow Name="Data Flow Import Share Table CSV">
                    <Transformations>
                        <FlatFileSource Name="Source Flat File Share Table" ConnectionName="FF_AFRShareTable"></FlatFileSource>
                        <DerivedColumns Name="DER_NullifyColumns">
                            <Columns>
                                <Column Name="DER_DPS" DataType="Decimal" Precision="4"><![CDATA[[Div c per share] == "-" ? NULL(DT_DECIMAL, 4)  : (DT_DECIMAL, 4)[Div c per share]]]></Column>
                            </Columns>
                        </DerivedColumns>
                    </Transformations>
                </Dataflow>
            </Tasks>
        </Package>
    </Packages>
</Biml>

上面的 biml 对我有用。我所做的更改:

  • 从任务和组件名称中删除了 {}
  • 更新了 FlatFileFormat Columns 集合中的最后一个 Column 定义,以使用 CRLF 分隔符而不是 ,
  • 我为表达式使用了 CDATA 标记。这里不需要,但如果你有一个 >< 在那里,那么你需要将它们转义为 < 或我使用的 CDATA 方法。
  • 我还清理了派生列的实体分配。等号周围有空格,我不相信那些应该在那里。
  • 平面文件路径更新 + OLE DB 以配合我的设置。

源数据

0
1
2
3
4
5
Quote Buy,Quote Sell,Div c per share
1,1,1
2,2,2
3,3,-

结果