0

BIML で派生列変換を定義していますが、派生列変換で以前の Excel ソースからの出力を参照するのに問題があります。

SSIS パッケージを正常に生成した後、パッケージを開くとエラーが表示されます。これは、派生変換が Excel ソースからの出力を見つけられないことを示しています。

エラー 2 AFR_ShareTableBIML.dtsx のロード中にエラーが発生しました: オブジェクト "/DTS:Executable/DTS:Executables/DTS:Executable/DTS:ObjectData/pipeline/components/component/inputs/input/inputColumns/inputColumn/properties/property" は ID "# を参照しています{Package\Data Flow {Import Share Table CSV}\Source {Flat File Share Table}.Outputs[Output].Columns[Div c per share]}" ですが、パッケージ内のオブジェクトにはこの 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角かっこ "[" と "]" を 2 つのアポストロフィに置き換えると、SSIS パッケージを開くことができることがわかりました。例えば:

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

ただし、構文が正しくない場合、派生列の変換エラーが発生します。エスケープする必要がある BIML の角括弧は特殊文字ですか?

4

1 に答える 1

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 タグを使用しました。ここでは必要ありませんが、そこに>orがある場合<は、 < または私が使用した 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,-

結果

成功

于 2016-06-15T15:34:35.037 に答える