在SSIS中复制脚本组件后,程序集名称冲突

use*_*983 6 ssis copy-paste script-component .net-assembly

我创建了一个SSIS包(在VS 2013中),其中包含一个包含多个脚本组件的数据流任务。我需要添加另一个与现有数据流任务类似的数据流任务,因此我将其复制并粘贴到包中,并添加了优先级约束,以便新任务在旧任务之后运行。我根据业务需求更改了新数据流任务中脚本组件中的代码,并运行了该程序包。我很快意识到,当新数据流任务运行时,旧数据流中的脚本组件正在执行。奇怪的。

经过一些互联网搜索,我找到了以下页面:

http://kohera.be/blog/sql-server/the-dangers-of-copying-script-components-in-ssis/

其中描述了数据流任务的复制如何不更改新数据流中任何脚本组件中的程序集名称或根名称空间。显然,在运行时,新脚本的汇编将被旧脚本的汇编覆盖。网页上说可以通过将脚本组件复制到另一个程序包,然后再将其复制回原始程序包来解决此问题。大概会更改每个脚本组件的程序集名称。我很高兴它对他有用,但对我没有用。

我还尝试在此处的脚本编辑器中更改程序集名称:

应用属性

但这也不起作用。旧脚本组件中的代码仍在新数据流中运行。我猜想根目录名称空间需要更改,但是它是灰色的,所以我不能手动更改它。因此,我仍在寻找一种不涉及从头开始重新创建脚本组件的解决方案,因为它们包含多个输出,每个输出中都有许多列。希望你能有一个答案。

Mat*_*att 3

我对你的问题很好奇,因为我过去也遇到过这种情况,我通过简单地重新创建脚本组件并复制相关代码来纠正。显然比想法少,但是......

无论如何,我通过查看记事本中的 dtsx 包(注意它只是 xml)确认复制的问题是应用程序/命名空间保持不变,因此在编译时,一个会覆盖另一个。

我发现了一个很好的博客,介绍了一种方法Sript Taskhttp://agilebi.com/jwelch/2008/04/30/renaming-the-script-project-in-ssis-2008/),但相同的解决方案并没有看起来它在 a 中不可用,Script Component因为后者没有可用的表达式......

脚本组件方法 - 测试成功

然而,我确实重现了问题并找到了解决方案。诚然,我不确定我的解决方案是否比重新创建脚本组件并在脚本中复制更容易。无论如何,DTSX 是一个 XML 文件,因此您可以直接编辑它!就我的情况和可能的标准而言,我必须更改 10 个位置的值。所以

  • 找到命名空间/程序集名称的值(我会让您找出要从哪里获取它的几个地方)。
  • 然后将包上的文件扩展名更改为 XML 并在 XML 编辑器(例如 Visual Studio)中打开
  • 执行“查找全部”以查找程序集名称出现的所有位置,请记住,这将是您需要更改的数量的两倍,因为两个组件都使用相同的名称。
  • 导航结果时,第一个结果上方几行将是一个名称,用于标识您所在的组件和数据流。
  • 逐步浏览结果,直到找到要更改的组件,在我的例子中,这是第 11 个结果。然后更改该结果和搜索结束之间的所有值,或者直到发现您位于另一个数据流/组件中。
  • 将文件重命名回 .dtsx 即可完成。

创建包裹的备份副本以防万一!

脚本任务方法 - 测试成功

Script task如果您在控制流中讨论,那么这是一个简单的方法。

  • 转到propertiesofScript task并选择Expressions
  • 在属性中输入一个新值ScriptProjectName
  • 通过选择编辑来编辑脚本来确认您的更改已发生。

在此输入图像描述