求助:SSIS包执行返回0行,单独运行数据流任务获400k行
这种情况我碰到过好几次,单独跑数据流任务能正常返回400k行,但整包运行就返回0行还没任何错误警告,大概率是包级别的配置或执行上下文和单独跑数据流时不一致导致的。给你列几个最常见的排查方向,按顺序试:
检查包级变量/参数的取值差异
单独调试数据流时,你可能手动设置了变量的测试值,但整包运行时,变量可能从配置文件、环境变量或者启动参数里获取了不同的值(比如日期范围参数被设成了空区间,或者筛选条件变成了不存在的取值)。
可以在包的OnPreExecute事件里加个脚本任务,把关键变量的值输出到Windows事件日志或者本地文本文件,对比单独跑和整包跑时的变量值是否一致。验证事务设置
如果包的TransactionOption设成了Required(开启分布式事务),但你的OLEDB源连接没有参与事务,或者事务在数据流执行前就被意外回滚了,可能导致数据无法正常读取。
先临时把包的TransactionOption改成NotSupported试试,如果能正常返回数据,再逐步排查事务相关的配置问题。排查数据源连接的权限/上下文差异
单独跑数据流时用的是你个人登录账号的权限,但整包运行时(比如用SQL Server Agent代理执行),可能用的是服务账号或者其他身份,这个账号可能没有读取源数据的权限,或者受行级安全限制看不到目标数据。
手动用整包运行时的账号登录数据库,执行OLEDB源里的查询语句,看看能不能返回预期的400k行数据。检查控制流的前置任务影响
整包运行时,控制流里的前置任务(比如执行SQL任务、脚本任务)可能修改了数据源的状态,或者动态生成的SQL查询条件出了问题(比如前置任务错误地清空了临时表,或者修改了查询的筛选参数)。
可以暂时禁用所有前置任务,只保留数据流任务再跑整包,如果正常返回数据,再逐个启用前置任务排查问题根源。调整日志级别捕获细节
默认的日志级别可能没记录足够的执行信息,把包的日志级别改成详细,重点查看OLEDB源的执行日志,确认它实际执行的SQL语句是什么,以及返回的行数统计。
另外,也可以在OLEDB源的Advanced Editor里勾选RetainSameConnection选项,有时候连接池的复用问题也会导致这种异常情况。检查数据流的延迟验证设置
如果数据流任务的DelayValidation设成了False,包在启动时验证数据流对象时,可能因为某些依赖对象还没准备好,导致实际执行时用了错误的元数据或者查询条件。
把数据流任务的DelayValidation改成True后再测试整包运行。
内容的提问来源于stack exchange,提问作者MacAries

