我有几个几乎相同的包。仅在不同数据库版本中添加/删除的列有所不同。当我复制一个包并修改副本的数据流时,我删除了 OLE DB 数据源并添加了一个新的。一旦定义了新的,它的预览就完全符合我的期望。但是,列来自已删除的 OLE DB 源。就像它被缓存在某个地方一样。
好像我需要关闭包并在删除数据源后重新打开它。还有其他方法可以清除此缓存状态吗?内部发生了什么导致这种情况发生?
更多...看起来它是参数化的连接管理器,它保留以前的参数,直到包被关闭并重新打开。
我有几个几乎相同的包。仅在不同数据库版本中添加/删除的列有所不同。当我复制一个包并修改副本的数据流时,我删除了 OLE DB 数据源并添加了一个新的。一旦定义了新的,它的预览就完全符合我的期望。但是,列来自已删除的 OLE DB 源。就像它被缓存在某个地方一样。
好像我需要关闭包并在删除数据源后重新打开它。还有其他方法可以清除此缓存状态吗?内部发生了什么导致这种情况发生?
更多...看起来它是参数化的连接管理器,它保留以前的参数,直到包被关闭并重新打开。
如果我了解您的工作流程,您将复制和粘贴包,然后调整数据流中的源定义。挑战在于,一个系统中的 CustomerID 是 varchar(7),而在另一个系统中定义为 varchar(12)。“技巧”变成了让设计引擎识别元数据变化并做出相应的行为。
我通常的技巧是从根本上改变源。我发现使用查询SELECT 1 as foo
可以解决问题。之后,OLE DB 源组件的元数据会删除对渗透到下游组件的现有列的所有引用。然后我切换回正确的源并双击第一个红色 X 让它将 ID 从旧映射到新。
如果您想要比内战手术更多的脑外科手术路线,请更改源中的列名称以获取任何应该注册元数据更改的内容。因此SELECT T.MyColumn, T.IsFine FROM dbo.MyTable AS T
变成SELECT T.MyColumnX, T.IsFine FROM dbo.MyTable AS T
现在只有第一列在整个数据流中被 kiboshed。将其重置回“正确”列名,一切都很好。
在内部,我不知道,但这永远不会阻止我猜测。验证触发,SSIS 引擎识别数据类型仍然兼容,因此它不会更改现有元数据。不再存在的列足以让它坐起来并引起注意,因此缓存的大小就消失了。
有些人喜欢尝试使用高级属性来更改大小,但我发现仅使用上述方法比更改大小只是让设计师拍我的手并拒绝我提议的更改更成功。