这个问题的目的是记录我对在 2012 年之前使用脚本任务的一些旧版本的 SSIS 中创建的 SSIS 包的目标 SQL Server 版本时似乎是一个奇怪问题的回答。
多年来,通过各种版本的 BIDS/SSDT 升级时,最初在 BIDS 2005 或 2008 中创建的 SSIS 包没有任何问题。即使现在包升级到 SSDT 并以 SQL Server 2016 为目标,除了能够利用最新的 SSIS 功能(包部件、项目参数等)和通过 SSDT 部署包之外,一切仍然像往常一样工作/Visual Studio 到同一目标 SQL Server。安装了 SSIS 并升级到 2016 或 2017 的 SQL Server 似乎与 MSDB 或包存储中的包没有问题,因为升级后作业继续按预期运行。
因此,作为正常升级例程的一部分,决定打开一个 SSIS 包并像以前一样使用以前的 SSDT 更改对其进行升级。在以前的 SSDT 更改中,一个版本适用于特定版本的 SSIS。一旦他们引入了针对某些以前版本的 SSIS 的功能,该功能似乎可以按预期工作。我认为最新的 SSIS 和 SSDT 版本会是一样的。
但是,一旦在 SSDT 中将目标版本更改为 SQL Server 2017,就会出现一些 SSDT 未捕获/修复或由于某种原因无法处理的问题。我遇到的一些问题是:
- 无法更改目标 .Net Framework 版本,因为它始终恢复为脚本任务属性中的原始设置
- 会出现错误,例如“'Dts' 不是 'Microsoft.SQLServer' 的成员”、“未定义类型 'Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase'”、“无法迁移包含在包为 VSTA 14.0 格式。将脚本移动到新的脚本任务。”,并且“未定义类型'Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute'。”
- 构建脚本任务将失败,错误之一是“主要参考”Microsoft.SqlServer.ScriptTask,Version=14.0.0.0,Culture=Neutral,PublicKeyToken=89845dcd8080cc91“无法解决,因为它是针对”构建的。 NETFramework,Version=v4.5” 框架。这是比当前目标框架“.NETFramework,Version=v4.0”更高的版本,我会看到的另一个错误是“在 Imports 'Microsoft.SqlServer 中指定的命名空间或类型.Dts.Runtime' 不包含任何公共成员或找不到。确保命名空间或类型已定义并包含至少一个公共成员。确保导入的元素名称不使用任何别名。”
好消息是将目标更改回 SQL Server 2016 似乎可以正常工作,我可以像以前一样继续编辑包而不会出现错误,并且构建将按预期工作,但坏消息是将 2016 包部署到 2017 SSIS 服务器没有得到转换就像在 SQL Server 升级期间所做的那样。那么,我如何能够更新包以针对 SQL Server 2017 并且不存在阻止这种情况的这些问题呢?
问题的主要来源是在 2016 年和之前处理的 SSIS 模式中更改的标签没有问题。我必须查看 SSIS 包的代码来检查差异,而 SSIS 2017 似乎对脚本任务的 Project 标记的 PropertyGroup 节点内的架构更加严格。
这是一个有错误的标签:
似乎解决了我一半问题的修复是添加缺少的条目,以便上面现在看起来像下面的代码新条目(在 after
</ProjectGuid>
和 before</PropertyGroup>
)是:这是添加更改后的样子:
这样做并没有解决无法更改 .Net Framework 目标的问题,因此必须有其他内容,所以我查看了代码并发现了问题。在代码中我发现以下内容
</ProjectExtensions>
:由于这些现在位于脚本任务的主 PropertyGroup 中,因此它们被认为是多余的,因此在旧位置不再需要它们。删除这些条目解决了问题的另一半。这样做之后,我不仅能够将 SQL Server 目标更改为 2017,而且还能够更改 .Net Framework 版本并且它不会恢复。此外,构建能够再次成功构建。
以这种方式解决问题比尝试打开每个包并手动创建新的脚本任务、将逻辑从旧的复制到新的、确保变量和引用相同以及删除旧任务更容易。其他事情。这个过程需要很长时间,特别是如果有很多包要通过。
如果您遇到此问题,希望您会发现这很有用。