本地执行SSIS包遇版本差异问题:新包正常旧包报错求助
本地环境使用SSMS 2016客户端与Visual Studio 2017,通过PowerShell调用路径为C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn的Execute Package Utility执行自行创建的基于包部署模型的SSIS包可正常运行;但执行两年前用Visual Studio 2017创建的旧SSIS包时,报错Error Code:-0xC000F427,提示:
To run a SSIS package outside of SQL Server Data Tools you must install Standard Edition of Integration Services or higher
安装SSMS 2022(SQL2022-SSEI-Dev.exe)后两个包均能正常执行,现疑问为何SSMS 2016下新旧包执行结果不同,遗漏了哪些配置步骤?
SSIS目标版本不匹配
新创建的包大概率默认设置了与SSMS 2016(对应SQL Server 2016,SSIS版本130)兼容的目标版本,而两年前的旧包在Visual Studio 2017创建时,可能被设为更高的SSIS目标版本(比如SQL Server 2017,版本140)。低版本的dtexec.exe(130版)无法正确识别高版本目标的包,就会触发这个看似授权问题的版本兼容错误。SSIS运行时组件版本差异
SSMS 2016自带的是SQL Server 2016的SSIS运行时(130版),但Visual Studio 2017默认会安装SQL Server 2017的SSIS设计器和组件。旧包可能依赖2017版运行时的特性,130版运行时无法提供支持,就抛出了这类错误提示(有时版本不兼容会被包装成授权问题)。包配置的隐性差异
虽然都是包部署模型,但旧包可能启用了高版本SSIS才支持的配置,比如特定任务组件、加密设置,低版本运行时解析不了这些配置,进而触发错误。
- 统一包的目标SSIS版本
打开旧包的Visual Studio 2017项目,右键项目 → 属性 → 配置属性 → 常规,把“目标服务器版本”改成SQL Server 2016,重新生成包后再用130版的dtexec.exe执行。 - 安装匹配版本的SSIS运行时
如果要保留旧包的高版本目标,得在本地安装SQL Server 2017的SSIS运行时组件(必须和包的目标版本一致),然后调用对应版本的dtexec.exe(路径一般是C:\Program Files (x86)\Microsoft SQL Server\140\DTS\Binn\dtexec.exe)来执行旧包。 - 检查包的加密与依赖组件
打开旧包,查看是否启用了项目级加密或者使用了高版本专属的自定义组件,调整成130版兼容的设置,比如换成包级加密、替换为兼容组件。
内容的提问来源于stack exchange,提问作者Jerry

