2

BIML と BIDSHelper を使用して SSIS パッケージを作成しています。csv から SQL サーバーにデータをインポートしようとしています。データフローが発生する前に、宛先データベースにテーブルを作成したいと考えています。これが私のコードです:

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>       
    <OleDbConnection Name="CM_OLE" 
                     ConnectionString="Data Source=(localdb)\projects;Initial Catalog=test;Integrated Security=SSPI;Provider=SQLNCLI11">
    </OleDbConnection>
    <FlatFileConnection
            Name="FF Source"
            FileFormat="FFF Source"
            FilePath="F:\test.csv"
            CreateInProject="false" />
</Connections>
<FileFormats>
    <FlatFileFormat
            Name="FFF Source"
            CodePage="1252"
            RowDelimiter="CRLF"
            ColumnNamesInFirstDataRow="true"
            IsUnicode="false"
            FlatFileType="Delimited"
            TextQualifer="_x0022_"
            HeaderRowsToSkip="0">
        <Columns>               
            <Column Name="Column1" Length="50" InputLength="50" MaximumWidth="50" DataType="AnsiString"  ColumnType="Delimited"  CodePage="1252" Delimiter="," TextQualified="true" />
            <Column Name="Column2" Precision="10" Scale="2"  DataType="Decimal"  ColumnType="Delimited"  CodePage="1252" Delimiter="CRLF" TextQualified="true"  />
        </Columns>
    </FlatFileFormat>
</FileFormats>  
<Packages>      
    <Package ConstraintMode="Linear" Name="NumericParsingFromFlatFileInsertIdentity">
        <Tasks> 
            <ExecuteSQL Name="Create table sometablename" ConnectionName="CM_OLE">
                 <DirectInput>
                      CREATE TABLE sometablename(column1 varchar(50) NOT NULL, column2 varchar(10,2) NOT NULL);
                      GO 
                 </DirectInput>
            </ExecuteSQL>
            <Dataflow Name="DFT Source">
                <Transformations>
                    <FlatFileSource ConnectionName="FF Source" Name="FF Source" />
                    <OleDbDestination ConnectionName="CM_OLE" Name="OLEDB DST">
                        <ExternalTableOutput Table="sometablename"></ExternalTableOutput>
                    </OleDbDestination>                     
                </Transformations>
            </Dataflow>         
        </Tasks>
    </Package>
</Packages>

パッケージを生成しようとすると、と表示されますcannot execute query select * from sometablename invalid object namesometablenameテーブルが存在しないことを理解しているため、エラーがスローされます。では、どうすればテーブルを自動的に作成できますか? シリーズBI 思考と理論を読みました。パート 2 では、テーブルの作成方法を示します。私の理解では、最後に ExecuteSQl も作成してテーブルを作成します。データフローの前にテーブル作成スクリプトを実行する方法、または BIML が提供する他の代替手段は何ですか?

前もって感謝します

4

3 に答える 3

2

あなたがしようとしていることは、BIML では不可能のようです。

SSIS データフローでは、設計時にすべての外部列メタデータを使用できる必要があります。これを回避する方法はないため、Biml コンパイラはデータ ソースにクエリを実行してこの情報を取得する必要があります。この情報はパッケージに出力されます。BIDS/SSDT は、作業中に常にこの検証を行います。Biml はビルド時にのみ実行します。

ValidateExternalMetadata=false の実際の目的は、SSIS が、パッケージ実行時の検証フェーズ中に、データフロー メタデータで定義された外部列が外部データ ソースと一致するかどうかのチェックを控えることです。ただし、設計/ビルド時には、最初に外部列のメタデータを作成できるように、そのメタデータが存在している必要があります。明確にするために、これはネイティブ BIDS/SSDT と Biml の両方に当てはまります。

ValidateExternalMetadata は、所定のスキーマに一致するテーブルやファイルを動的に作成するなどのシナリオのために、SSIS チームによって提供されました。通常、(ビルド対象の) 開発環境でスキーマを事前にビルドしてから、必要に応じて本番環境で同じスキーマを動的に作成します。検証を無効にするということは、動的に作成されたオブジェクトから読み取ったり、そこにロードしたりする同じパッケージの一部として、動的な作成を実行できることを意味します。

Dev でもスキーマを具体化せずにビルドを行う必要があることは認識しています。今後のリリースで検討していることの 1 つは、ビルド時にデータフロー メタデータを取得することなく、Biml を使用してデータフロー メタデータを宣言できるようにする「オフライン メタデータ」機能です。実行時の外観と一致するようにメタデータを構築するために、ユーザー側でいくつかのスクリプト作業がありますが、それが正しく行われれば、あなたのようなシナリオが有効になります。

あなたができることはValidateExternalMetadata="false"、OLE DB Destination に追加することです。開発環境でテーブルを手動で作成してから、パッケージを生成します。

ValidateExternalMetadata を false に設定しているため、他の環境では問題なく実行されるはずです。

于 2015-04-05T10:41:59.043 に答える