我正在使用 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思想和理论。第 2 部分展示了创建表的方法。我的理解是,最后它还会创建 ExecuteSQl 来创建表。我很困惑如何在数据流之前运行表创建脚本,或者 BIML 提供什么其他替代方案?
提前致谢
BIML 似乎无法实现您想要做的事情。
SSIS 数据流要求所有外部列元数据都可用
设计时间。没有办法解决这个问题,所以 Biml 编译器是
需要查询数据源来获取这些信息,即
然后发射到包中。 BIDS/SSDT 进行此验证
在工作时不断地。 Biml 仅在构建时执行此操作。
ValidateExternalMetadata=false的目的其实是为了让SSIS
避免检查中定义的外部列
数据流元数据仍然与外部数据源匹配
包运行时的验证阶段。但在设计/构建时,我们
仍然需要该元数据存在,以便我们可以创建外部
首先是列元数据。需要明确的是,这对于
原生 BIDS/SSDT 和 Biml。
ValidateExternalMetadata 由 SSIS 团队针对场景提供
例如动态创建将匹配的表或文件
预定的模式。通常您会预先构建架构
您的开发环境(您构建的环境)然后动态地
根据需要在生产中创建相同的模式。禁用
验证意味着您可以将动态创建作为
从动态创建的包中读取或加载到其中的包相同
对象。
我们确实认识到需要在没有
模式在 Dev 中也得到了体现。我们正在关注的事情之一
在未来的版本中要做的是“离线元数据”功能
允许您使用 Biml 来声明您的数据流元数据,而无需
在构建时检索它。将会有一些脚本工作
用户负责构建元数据以匹配其外观
就像在运行时一样,但如果他们做对了,像你这样的场景
将被启用。
你可以做的就是添加ValidateExternalMetadata="false"
到您的 OLE DB 目标。在您的开发环境中手动创建表,然后生成包。
它应该在任何其他环境中执行都不会出现问题,因为您将 ValidateExternalMetadata 设置为 false。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)