SSIS错误:VS_NEEDSNEWMETADATA

12
我是一名有用的助手,可以为您翻译文本。

我目前正在使用Visual Studio 2015(由BIDS 2008制作)更新我们所有的ETL,并将它们重新部署到运行在SQL Server 2016上的新报告服务器上(最初是2008R2)。

在更新其中一个ETL并尝试在新服务器上运行时,我遇到了以下错误:


包执行失败。步骤失败。

有时还会出现以下错误:

来源:Load Fact Table SSIS.Pipeline 描述:“复制到事实表”未能通过验证,返回验证状态“VS_NEEDSNEWMETADATA”。


我已经尝试删除和重新添加OLEDB目标、连接字符串,并打开列映射以刷新元数据。我还重新创建了整个数据流任务,但仍然出现相同的错误。
该程序包在我的本地机器上运行良好。
更新:
我开始拆分程序包并只运行其中的一部分,以尝试缩小故障范围。似乎是在加载到分段表时失败了,但我无法找到原因。
最终,我决定尝试重新创建整个程序包。重新创建后,仍然没有成功。下面的图片来自服务器本身的事件查看器,但它没有给我任何新信息。

enter image description here

来自事件查看器的包错误


我通过 SQL Server 代理作业来执行它。SQL 服务也有该文件夹的权限。 - Jonathan Porter
1
包执行的详细信息有什么要说的吗?(报告->标准报告->所有执行,深入失败的执行)。 - Mike G
这将显示在 SSMS 中的程序包本身上,部署到的服务器上(Integration Services Catalogs/SSISDB/Your Env Name/Projects/Your Solution/Package/Package Name-> 右键单击) - Mike G
1
我能建议的就是将程序包裁剪至成功,然后添加下一个失败的步骤。 - Beth
2
@MikeG 这就是我找到问题的方法。在错误之前有一个警告,解释了为什么包未能通过元数据验证。 - Cryptc
显示剩余11条评论
14个回答

27

我已经尝试了上面提供的所有解决方案和其他网站,但都没有用。

我从朋友那里得到了一个建议,这对我有用。

以下是步骤:

  1. 右键单击源/目标数据流组件。
  2. 进入高级编辑器 -> 组件属性
  3. 找到ValidateExternalMetadata并将其设置为False

试试运气。这是一个令人沮丧的问题,让我糊涂了两天。

输入图像描述


这个解决方案对我也起作用了。但是为什么需要这样做呢? - APC
3
2020年的情况在VS-2019中仍未改变,提供这一信息。 - junketsu
完成了我的需求(不幸的是问题仍然存在)。 - glass_kites
我遵循了这个建议,现在错误信息更加详细。谢谢! - AGuyCalledGerald

19

我最终找到了问题并这就是我的做法。

由于我从SSMS得到的错误消息并不太有见地,因此我首先打开了远程桌面并登录到服务器。然后我去 管理工具>事件查看器 ,然后 Windows日志>应用程序 看看失败的事件是否能提供更详细的信息。

enter image description here enter image description here 它仍然没有给我太多信息。

接下来我采取的步骤是运行 命令行中的包,因为消息应该会更详细。打开cmd,切换到包所在的目录,然后...

DTEXEC /FILE YourPackageName.dtsx

最后,这里的错误信息显示在包试图写入的表格中有一个缺失的列。我添加了这些列,然后就好了!


3
如评论所述,如果在开发环境中运行正常,则问题不在于软件包,而在于服务器上的定时作业。请尝试重新创建定时作业。
如果这样做没有效果,似乎服务器使用的是缓存的软件包实例,而不是更新后的软件包。请尝试更改软件包名称,并创建一个新的作业,查看是否可以解决问题。
如果这样做也没有效果,那么建议您将软件包削减到成功为止,然后添加下一个失败的步骤。
从您的解决方案中可以看出,在部署的解决方案中,开发环境对模式更新更加宽容。很高兴您能够解决问题,消除混乱有助于解决问题。

2
我曾经遇到过同样的问题,我的问题是两个环境之间存在差异,在同一张表中,同一个字段有时被写成大写,有时不是。因此名称是相同的,但是由于这个小差异(例如 isActive vs IsActive),导致了问题。
这是来自重构工作的结果,我们使用了VS数据库发布,但没有更新字段名称。

这就是导致问题的原因。 - Manuel Hoffmann
谢谢您的建议-这也是我的问题。您可能会发现,根据上面的答案设置ValidateExternalMetadata: false也可以解决此问题。 - AndyS

0

当源文件中的两列被插入到表的同一字段中时,收到该消息非常普遍。

例如:

我的文本文件两次出现“neighborhood”(相同标签用于不同的列),而我的表格有“neighborhood”和“neighborhoodb”(注意末尾的“b”)。导入将尝试将两个文本列导入到“neighborhood”字段中,并忽略“neighborhoodb”字段,这将导致“VS_NEEDSNEWMETADATA”错误。


0

你尝试过删除并重新创建源吗?当我遇到这种情况时,通常可以修改任何出现错误的对象,但必须删除并重建它们之间的路径,然而有时候我不得不删除数据流中的所有内容并重新创建。


我尝试重新创建源代码,当其他方法都无效时,最终不得不重新创建整个软件包,但仍然出现“软件包执行失败。步骤失败。”的错误信息。 - Jonathan Porter

0
应该在 SQL Server 代理下创建一个 SSIS 包执行代理。然后,您应该更改作业步骤(或步骤)以运行您创建的代理。
我曾经遇到过与您相同的问题,而代理解决了它。
如果您已经尝试过,请原谅我。

0
重新创建作业对我有用。作业的某些缓存版本可能导致VS_NEEDSNEWMETADATA错误。该包在手动执行时可以正常运行,但在代理作业执行时失败。

0

对我来说,这最终是一个权限问题。OLE DB源使用了一个选择自SQL视图的存储过程。该视图连接到另一个数据库中的表,不幸的是,SQL代理作业步骤在包下运行的代理帐户没有该数据库中表的SELECT权限。这就是为什么当部署到服务器后,该包在Visual Studio中运行良好但从作业中却无法运行的原因。通过将SELECT语句从存储过程中取出并直接放入OLE DB源控件的源查询框中,导致它最终返回“拒绝SELECT权限”的错误消息,我找到了错误的根本原因。由于代理帐户确实对存储过程具有执行权限,所以SSIS显然隐藏了此错误。


0

在将数据从MSSQL数据库传输到MySQL数据库时,将ValidateExternalMetadata更改为false后,它对我有效。更改了“ADO NET Destination”。


1
你是对的 @Vega,谢谢提醒。 - Viktor Jovanovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接