VS2015正常运行的DTS在SQL Server Agent中Script Task为空求助
解决SQL Server Agent中DTS脚本任务为空的问题
我之前也碰到过一模一样的情况——VS2015里跑DTS包顺得不行,一上传到SQL Server Agent作业里,Script Task直接空了,连个报错提示都没有,真的挺闹心的。下面是我亲测有效的几个排查和解决方向,你可以挨个试试:
1. 检查SQL Server Agent服务的.NET环境兼容性
Script Task严重依赖.NET框架版本,VS2015默认用的是.NET 4.5及以上版本,但SQL Server Agent的服务账户可能没配置好对应的.NET环境,或者服务器上压根没装所需的.NET版本:
- 先确认你的SQL Server版本对应的.NET要求:比如SQL Server 2016及以后支持.NET 4.x,2014及之前可能需要.NET 3.5(但VS2015的脚本可能用了4.x的特性)。
- 用SQL命令启用CLR支持(很多Script Task需要这个):
要是你用的是SQL Server 2017及以上版本,还得调整EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'clr enabled', 1; RECONFIGURE;clr strict security设置,否则自定义程序集会被拦截:
注意:执行这些命令需要sysadmin权限。EXEC sp_configure 'clr strict security', 0; RECONFIGURE;
2. 验证权限:SQL Server Agent账户能访问包和程序集吗?
VS里跑包用的是你的本地账户权限,而SQL Server Agent用的是它自己的服务账户(比如NT SERVICE\SQLSERVERAGENT),这个账户很可能没有访问包文件或脚本编译后程序集的权限:
- 如果包存在文件系统里:找到包的存储路径,右键文件夹→属性→安全,添加SQL Server Agent的服务账户,给它读取和执行权限。
- 如果包存在MSDB里:确保Agent账户有
db_ssisoperator或更高的数据库角色权限。 - 另外,SQL Server的临时目录(比如
C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Temp)也要给Agent账户读写权限,脚本任务编译时会用到这里。
3. 调整包的保护级别,别让加密坑了你
VS默认的包保护级别是EncryptSensitiveWithUserKey——这个设置会用你的本地账户密钥加密敏感信息,包括脚本任务的代码。换了Agent账户运行,自然解密不了,脚本就显示为空了:
- 打开你的SSIS包,在属性窗口找到
ProtectionLevel,根据情况修改:- 要是包里没敏感信息(比如没密码、没连接字符串),直接改成
DontSaveSensitive; - 要是有敏感信息,改成
EncryptSensitiveWithPassword,设置一个密码,然后在SQL Server Agent作业的步骤里,找到“配置”选项,输入这个密码; - 要是包存在MSDB里,改成
ServerStorage最省心,它会用SQL Server的密钥加密。
- 要是包里没敏感信息(比如没密码、没连接字符串),直接改成
4. 重新部署包,别偷懒直接复制文件
有时候直接复制包文件会丢东西,比如脚本任务编译后的程序集没传上去。建议用正规的部署方式:
- 在VS2015里右键项目→“发布”,选择目标SQL Server,一步步完成部署;
- 或者用SSIS部署向导,确保部署过程中没有任何警告或报错;
- 另外,检查脚本任务里有没有引用本地的自定义DLL,这些DLL要一起部署到服务器的GAC(全局程序集缓存)或者SQL Server的程序集目录里。
5. 去日志里挖线索,别光看表面的“无报错”
虽然包运行时没弹出报错,但SQL Server和Agent的日志里肯定藏着细节:
- 在SSMS里打开
管理→SQL Server日志,搜索“SSIS”“Script Task”相关条目; - 再打开
SQL Server Agent→错误日志,找和你的作业相关的记录,大概率能找到脚本加载失败的具体原因(比如程序集找不到、权限不足)。
我当时碰到的情况是保护级别没改,换了Agent账户就解密不了脚本,改完保护级别就正常了。你可以先从保护级别和权限这两个方向入手,应该能解决问题。
内容的提问来源于stack exchange,提问作者MagdielAybar
相关产品推荐
相关产品推荐

