我正在使用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 name。我知道表sometablename不存在,所以它会抛出错误。那么,如何自动创建表呢?我看过双性恋思想与理论系列。第2部分展示了创建表的方法。我的理解是,在最后,它还创建了ExecuteSQl来创建表。我很困惑如何在数据流之前运行表创建脚本,或者BIML还能提供什么其他选择呢?
提前感谢
发布于 2015-04-05 10:41:59
SSIS数据流要求所有外部列元数据在设计时可用。这是无法避免的,因此Biml编译器需要查询数据源以获取该信息,然后将该信息发送到包中。投标/SSDT在您工作时不断地进行此验证。Biml只在构建时才这样做。 ValidateExternalMetadata=false的目的实际上是为了避免在运行包的验证阶段检查数据流元数据中定义的外部列是否与外部数据源匹配。但是在设计/构建时,我们仍然需要存在元数据,这样我们就可以首先创建外部列元数据。明确地说,这对于本地出价/SSDT和Biml都是正确的。 ValidateExternalMetadata是由SSIS团队提供的,用于动态创建匹配预定模式的表或文件等场景。通常,您会在dev环境上预先构建模式(您是根据它构建的),然后根据需要在生产中动态地创建相同的模式。禁用验证意味着您可以将动态创建作为从这些动态创建的对象读取或加载到这些对象的同一个包的一部分。 我们确实认识到,在不将模式在Dev中物化的情况下,也需要进行构建。我们在未来版本中要做的事情之一是“离线元数据”特性,它允许您使用Biml声明数据流元数据,而不必在构建时检索它。用户需要做一些脚本工作来构造元数据以匹配运行时的样子,但是如果他们做对了,就会启用像您这样的场景。
您可以做的是将ValidateExternalMetadata="false"添加到OLE DB目的地。在开发环境中手动创建表,然后生成包。
它应该在任何其他环境上都没有问题地执行,因为您将ValidateExternalMetadata设置为false。
发布于 2018-02-21 09:12:27
对于任何试图实现这一目标的人,Biml现在可以通过OfflineSchema元数据元素引用不存在的对象。这允许您指定无法连接到的表或结果集,以便Biml引擎将SSIS构建建立在此基础上。
https://varigence.com/Documentation/Language/Element/AstOfflineSchemaNode
发布于 2015-07-30 17:45:38
在一个有点相关的注意事项上,查看塞缪尔·万加的文章并注意"Create“方面。运行该包将在DB中创建表,然后可以生成依赖于这些表的SSIS包。
我使用他的示例实现了以下工作流:
https://stackoverflow.com/questions/29450082
复制相似问题