我有一个SSIS包,在他的OLEDB目的地有一个NVARCHAR(MAX)字段。该字段甚至没有被数据流填充。数据流任务失败,并显示错误“无法创建OLE DB访问者。验证列元数据是否有效”。
我看到了这个类似的问题:How do I fix the multiple-step OLE DB operation errors in SSIS?并且根据它的建议检查了我的元数据。我发现SSIS将违规列映射为NTEXT而不是DT_WSTR。我尝试将其类型更改为长度为8000的DT_WSTR,但仍然会出现相同的错误。还尝试用NULL填充字段,同样的错误。将“验证外部元数据”设置为false并没有任何区别。有关如何解决它的任何建议?
感谢。
答案 0 :(得分:4)
我找到了另一种(可能更快)解决方法,但它有点尴尬。需要注意的是,您的数据可能会被截断。使用它是否是个好主意取决于数据的用途。
假设违规列输出已设置为Unicode text stream [DT_NTEXT]
。在第一次转换后添加第二个数据转换步骤,将第一次转换的输出放入第二次转换,您可以从Unicode text stream [DT_NTEXT]
映射到Unicode string [DT_WSTR]
(长度= 4000)。它会警告您截断的可能性,但现在您可以使用第二次转换的输出数据。
答案 1 :(得分:1)
仅仅为了记录,我结束了使用.Net目的地,这个错误不会发生。
答案 2 :(得分:1)
我有类似的问题。我有一个从NVARCHAR(MAX)更改为NVARCHAR(4000)的SQL字段,但是给出了我描述的相同错误。令人难以置信的令人沮丧。我能够通过取消映射OLE DB目标中的列错误地将字段列为NTEXT来修复它。然后,遍历OLE DB目标之前的每个SSIS操作,并选择“显示高级编辑器...”,然后单击“刷新”。在为前面的每个步骤执行此操作后,我重新映射了列,SSIS最终选择了该列现在是DT_WSTR。
答案 3 :(得分:0)
我在ACCESS数据库中遇到了同样的问题,因此我使用了派生列,并创建了所有必需的字段(DT_STR,<>,<>)(长度为表列的大小和代码页是1252)。这不仅在ACCESS中起作用,而且也在EXCEL源中起作用。
希望这有帮助。
答案 4 :(得分:0)
我最终使用的是.NET目的地,但真正的问题是目标表列已过时。
尝试通过将目标更改为另一个表然后更改为上一个表或直接删除该操作然后再使用正确的映射将其重新添加来刷新它们。