首页 文章

在BIML中的数据流之前创建表

提问于
浏览
2

我正在使用BIML和BIDSHelper来创建SSIS包 . 我试图将数据从csv导入到SQL Server . 我想在数据流发生之前在目标数据库中创建表 . 这是我的代码:

<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 name . 我知道表 sometablename 不存在所以它会抛出错误 . 那么,我怎样才能自动创建表格呢?我读过BI Thoughts and Theories系列 . 第2部分显示了创建表的方法 . 我的理解是,最后它还创建了ExecuteSQl来创建表 . 我很困惑如何在数据流之前运行表创建脚本或者其他替代BIML提供什么?

提前致谢

3 回答

  • 0

    It seems what you're trying to do is not possible with BIML.

    SSIS数据流要求所有外部列元数据在设计时可用 . 没有办法解决这个问题,因此需要Biml编译器查询数据源以获取此信息,然后将其发送到包中 . BIDS / SSDT会在您工作时不断进行此验证 . Biml只在构建时才这样做 . ValidateExternalMetadata = false的目的实际上是SSIS在运行包的验证阶段期间避免检查数据流元数据中定义的外部列是否仍然与外部数据源匹配 . 但是在设计/构建时,我们仍然需要存在元数据,以便我们可以首先创建外部列元数据 . 需要明确的是,对于原生BIDS / SSDT和Biml来说都是如此 . ValidateExternalMetadata由SSIS团队提供,用于动态创建与预定模式匹配的表或文件等方案 . 通常,您将在您的开发环境(您构建的环境)中预先构建架构,然后根据需要在 生产环境 环境中动态创建相同的架构 . 禁用验证意味着您可以将动态创建作为从这些动态创建的对象读取或加载到这些动态创建的对象的同一个包的一部分 . 我们确实认识到需要在没有在Dev中实现架构的情况下进行构建 . 我们在未来版本中正在考虑的一件事是“离线元数据”功能,它允许您使用Biml声明数据流元数据,而无需在构建时检索它 . 用户可以使用一些脚本来构建元数据以匹配运行时的元数据,但是如果它们正确,那么将启用像您这样的场景 .

    您可以做的是将 ValidateExternalMetadata="false" 添加到您的OLE DB目标 . 在开发环境中手动创建表,然后生成包 .

    它应该在任何其他环境中执行时没有问题,因为您将ValidateExternalMetadata设置为false .

  • 0

    对于其他试图实现此目的的人,Biml现在可以通过 OfflineSchema 元数据元素引用不存在的对象 . 这允许您指定无法连接到Biml引擎以基于SSIS构建的表或结果集 .

    https://varigence.com/Documentation/Language/Element/AstOfflineSchemaNode

  • 0

    在一个有点相关的说明,请查看Samuel Vanga's article并注意"Create Objects"方面 . 运行该包将在DB中创建表,之后您可以生成依赖于这些表的SSIS包 .

    我用他的例子来实现以下工作流程:

    • 阅读用于字段名称,数据类型的Excel工作簿电子表格(这是在平面文件中请求数据时为客户端提供的模板)

    • 使用平面文件名/ ID,字段[名称,数据类型,分隔符,精度,比例等]填充元数据表

    • 读取元数据表以通知平面文件源,创建登台表,创建读取平面文件的包以及填充登台表 .

相关问题