表达式的SSIS BIML派生列语法

时间:2016-06-05 11:23:59

标签: ssis biml

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

我在成功生成SSIS包后打开包时收到错误,并且它表明Derived Transformation无法从Excel Source中找到输出。

  

错误2加载AFR_ShareTableBIML.dtsx时出错:对象   “/ DTS:可执行/ DTS:可执行/ DTS:可执行/ DTS:目标数据/管道/组件/部件/输入/输入/ inputColumns / inputColumn /属性/属性”   引用ID“#{Package \ Data Flow {Import Share Table CSV} \ Source   {平面文件共享表}。输出[输出] .Columns [每股收益]}“,   但是包中的任何对象都没有此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中的方括号特殊字符吗?

1 个答案:

答案 0 :(得分:1)

那很有意思。

您在组件名称中使用花括号似乎会导致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标记。这里不需要,但如果你有><,那么你需要将它们作为&lt;或者我使用的CDATA方法。
  • 我还清理了Derived Column的实体作业。平等地周围有空间,我不相信那些应该在那里。
  • 平面文件+ OLE DB的路径更新,以便与我的设置一起使用。

源数据

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

结果

Success