首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在BIML中的数据流之前创建表

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

Stack Overflow用户
提问于 2015-04-04 18:38:59
回答 3查看 2.9K关注 0票数 2

我正在使用BIML和BIDSHelper创建SSIS包。我正在尝试将数据从csv导入到sql服务器。我想在数据流发生之前在目标数据库中创建表。这是我的代码:

代码语言:javascript
复制
<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不存在,所以它会抛出错误。那么,如何自动创建表呢?我看过双性恋思想与理论系列。第2部分展示了创建表的方法。我的理解是,在最后,它还创建了ExecuteSQl来创建表。我很困惑如何在数据流之前运行表创建脚本,或者BIML还能提供什么其他选择呢?

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-05 10:41:59

使用BIML,您试图做的事情似乎是不可能的。

SSIS数据流要求所有外部列元数据在设计时可用。这是无法避免的,因此Biml编译器需要查询数据源以获取该信息,然后将该信息发送到包中。投标/SSDT在您工作时不断地进行此验证。Biml只在构建时才这样做。 ValidateExternalMetadata=false的目的实际上是为了避免在运行包的验证阶段检查数据流元数据中定义的外部列是否与外部数据源匹配。但是在设计/构建时,我们仍然需要存在元数据,这样我们就可以首先创建外部列元数据。明确地说,这对于本地出价/SSDT和Biml都是正确的。 ValidateExternalMetadata是由SSIS团队提供的,用于动态创建匹配预定模式的表或文件等场景。通常,您会在dev环境上预先构建模式(您是根据它构建的),然后根据需要在生产中动态地创建相同的模式。禁用验证意味着您可以将动态创建作为从这些动态创建的对象读取或加载到这些对象的同一个包的一部分。 我们确实认识到,在不将模式在Dev中物化的情况下,也需要进行构建。我们在未来版本中要做的事情之一是“离线元数据”特性,它允许您使用Biml声明数据流元数据,而不必在构建时检索它。用户需要做一些脚本工作来构造元数据以匹配运行时的样子,但是如果他们做对了,就会启用像您这样的场景。

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

它应该在任何其他环境上都没有问题地执行,因为您将ValidateExternalMetadata设置为false。

票数 2
EN

Stack Overflow用户

发布于 2018-02-21 09:12:27

对于任何试图实现这一目标的人,Biml现在可以通过OfflineSchema元数据元素引用不存在的对象。这允许您指定无法连接到的表或结果集,以便Biml引擎将SSIS构建建立在此基础上。

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

票数 1
EN

Stack Overflow用户

发布于 2015-07-30 17:45:38

在一个有点相关的注意事项上,查看塞缪尔·万加的文章并注意"Create“方面。运行该包将在DB中创建表,然后可以生成依赖于这些表的SSIS包。

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

  1. 阅读Excel工作簿电子表格中的字段名、数据类型(这是在请求平面文件中的数据时给客户端的模板)
  2. 使用平面文件名/id、字段名、数据类型、分隔符、精度、缩放等填充元数据表。
  3. 读取元数据表以通知平面文件源、创建暂存表、创建读取平面文件的包和填充暂存表。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29450082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档