DTExec.exe与SSIS向下兼容性及旧版SSIS包在新版DTExec下运行报错的解决方案咨询
DTExec.exe与SSIS向下兼容性及旧版SSIS包在新版DTExec下运行报错的解决方案咨询
老兄,你遇到的这个0xC001F02A错误我之前在企业环境里也碰到过,本质是新版SSIS运行时(170版本,对应SQL Server 2017)和VS2015创建的旧版包(基于SQL Server 2016/130版本)的格式不兼容,导致无法解析任务的XML配置。下面给你几个不用装旧版SSDT、也不用逐个手动升级几百个包的实用方案:
方案1:安装对应版本的SSIS独立运行时
这是最直接省心的解决办法。微软提供了独立于SSDT和Visual Studio的SSIS运行时安装包,你可以在新服务器上安装SQL Server 2016(130版本)的SSIS运行时——这个安装包只包含运行SSIS包所需的核心组件,体积小,权限要求也低,完全不用装整个SSDT或旧版VS。
安装完成后,你就能在原来的路径C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\DTExec.exe找到熟悉的旧版执行程序,直接沿用原来的批处理命令就行,包不用做任何修改。
方案2:批量修改包的兼容属性(无需打开VS)
如果服务器管控严格不允许安装额外软件,可以用dtutil.exe工具批量修改包的兼容属性,让新版DTExec能正确识别旧包:
- 单个包的修改命令:
# 设置目标服务器版本为SQL Server 2016 dtutil /FILE "C:\Path\To\Your\Package.dtsx" /SET DTS:Package\TargetServerVersion;SQLServer2016 # 设置包格式版本为6(对应VS2015/SQL Server 2016) dtutil /FILE "C:\Path\To\Your\Package.dtsx" /SET DTS:Package\PackageFormatVersion;6
- 几百个包批量处理的话,写个简单的PowerShell脚本循环搞定:
# 遍历指定文件夹下所有dtsx包(包括子文件夹) Get-ChildItem -Path "C:\Your\Root\Package\Folder" -Filter *.dtsx -Recurse | ForEach-Object { # 调用新版dtutil修改属性 & "C:\Program Files\Microsoft SQL Server Management Studio 21\Release\Common7\IDE\CommonExtensions\Microsoft\SSIS\170\Binn\dtutil.exe" /FILE $_.FullName /SET DTS:Package\TargetServerVersion;SQLServer2016 & "C:\Program Files\Microsoft SQL Server Management Studio 21\Release\Common7\IDE\CommonExtensions\Microsoft\SSIS\170\Binn\dtutil.exe" /FILE $_.FullName /SET DTS:Package\PackageFormatVersion;6 }
修改完成后再用新版DTExec运行,基本就能解决XML解析的错误了。
方案3:通过SSIS目录(SSISDB)运行包
如果你们的包是用项目部署模型管理的,可以把包部署到新服务器的SSISDB中,然后设置SSISDB的兼容级别为SQL Server 2016,再用新版DTExec通过/SQL参数从SSISDB运行包:
DTExec.exe /SQL "\YourSSISProject\YourPackage" /SERVER YourSQLInstanceName /DECRYPT YourPackagePassword
SSISDB的兼容级别会自动处理包的运行兼容逻辑,不用修改包本身的任何配置。
内容来源于stack exchange




