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 必须提供什么?

提前致谢

4

3 回答 3

2

BIML似乎无法实现您想要做的事情。

SSIS 数据流要求所有外部列元数据在设计时都可用。没有办法解决这个问题,因此需要 Biml 编译器查询数据源以获取此信息,然后将其发送到包中。BIDS/SSDT 在您工作时不断进行此验证。Biml 仅在构建时执行此操作。

ValidateExternalMetadata=false 的目的实际上是让 SSIS 在运行包时的验证阶段避免检查数据流元数据中定义的外部列是否仍然匹配外部数据源。但是在设计/构建时,我们仍然需要该元数据存在,以便我们可以首先创建外部列元数据。需要明确的是,本机 BIDS/SSDT 和 Biml 都是如此。

ValidateExternalMetadata 由 SSIS 团队提供,用于动态创建与预定架构匹配的表或文件等场景。通常你会在你的开发环境(你构建的)上预先构建模式,然后根据需要在生产环境中动态创建相同的模式。禁用验证意味着您可以将动态创建作为读取或加载到这些动态创建的对象的同一包的一部分进行。

我们确实认识到需要在没有在 Dev 中实现模式的情况下进行构建。我们正在考虑在未来版本中做的一件事是“离线元数据”功能,它允许您使用 Biml 来声明您的数据流元数据,而无需在构建时检索它。用户将进行一些脚本工作来构建元数据以匹配它在运行时的样子,但如果他们做对了,就会启用像你这样的场景。

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

由于您将 ValidateExternalMetadata 设置为 false,因此它应该在任何其他环境中执行都不会出现问题。

于 2015-04-05T10:41:59.043 回答
1

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

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

于 2018-02-21T09:12:27.007 回答
0

在一些相关的注释中,查看Samuel Vanga 的文章并注意“创建对象”方面。运行该包将在数据库中创建您的表,之后您可以生成依赖于这些表的 SSIS 包。

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

  1. 阅读 Excel 工作簿电子表格以获取字段名称、数据类型(这是在请求平面文件中的数据时提供给客户的模板)
  2. 使用平面文件名/ID、字段 [名称、数据类型、分隔符、精度、比例等] 填充元数据表
  3. 读取元数据表以通知平面文件源、创建临时表、创建读取平面文件的包和填充临时表。
于 2015-07-30T17:45:38.207 回答