如何绕过SSIS VS_NEEDSNEWMETADATA错误?

时间:2014-10-04 16:01:37

标签: sql-server ssis sql-server-2008-r2 export-to-excel

我使用SQL Server的导入/导出实用程序创建了一个SSIS包,以将数据从视图导出到Excel文件。我还通过SQL Server中的计划安排了它,一切都运行良好。

我从中导出数据的观点实际上是从多个视图中获取数据,依此类推,在"层次结构"中约有3个级别。

当我修改进入顶级视图的任何视图的列别名时,我遇到错误VS_NEEDSNEWMETADATA,我从中导出数据。

经过研究,我明白这就是我收到错误的原因,但有没有办法传播" "新视图的元数据"所以每次我改变视图的结构时,我都不必重新创建SSIS包?

3 个答案:

答案 0 :(得分:3)

不。 SSIS中的数据流与源紧密绑定。对列名称或数据类型的更改将导致验证步骤失败,从而导致错误。

为了减轻它,我要么考虑保持列别名相同 - 在这方面,视图/表值函数/存储过程很方便。

我将使用的另一种方法是自动创建包。根据您的个人资料,我怀疑这是一件简单的事情。而不是右键单击SSMS以在每次更改时重新创建SSIS包,而是使用您认为合适的任何技术。我已经使用基础.NET SSIS库来创建包,但是当我使用COM(数据流项)时,它们会让我感到痛苦。然后我使用EzAPI构建了包,它抽象了一些COM的东西,但它不是100%完整的功能。我目前对备用包装结构的热爱是Biml

从CodePlex下载BIDS Helper。它是免费的,并提供了许多有用的功能,并没有削减SSIS / SSRS / SSAS的开发。位于其中的是将Biml XML转换为SSIS包XML的能力。您可以look through my answers查看其中的一些工作方式。在您的情况下,它将成为Excel目标的一个非常基本的OLE DB源。您指定源视图名称,只要您对视图进行更改,请单击生成包,然后您就完成了。 Biml将联系您的源代码,识别元数据并使用它来生成目标的数据类型和名称。

答案 1 :(得分:0)

唯一有效的方法是根据来自文件的数据创建一个脚本任务来读取您的表架构并添加或更改它。您必须通过C#自定义解析文件。并通过C#连接并编写您的数据库。要保持与SSIS相同的性能,请实现IDataReader并将其传递给SqlBulkCopy。 DataTable也可能实现IDataReader。

或者购买连接到SSIS的第三方实用程序。并将该产品的程序集部署到SQL Server。

我会说,这是一个巨大的痛苦。我发现将.csv保存到Hadoop / HDFS + SQL Server和Polybase使其可以自动查询而不需要etl更容易。

答案 2 :(得分:0)

我遇到了相同的问题,在我的情况下,这是从Azure Blob存储读取时源组件失败。花了几个小时找出并最终解决了这个问题。即使列名在以前的文件中都相同,并且这次成功加载的情况也改变了,但列数很少,错误“ VS_NEEDSNEWMETADATA”也是如此。在得到列名的情况下,更正了文件成功加载的情况。希望这会有所帮助。