从PowerShell执行SSIS包仅返回进程结果码,无法获取结果集
解决PowerShell调用SSIS包无法获取结果集的问题
我懂你现在的困扰——用Package.Execute()执行SSIS包后,只能拿到进程结果码,想要的业务结果集却没影。这其实是因为这个方法本身的设计就是返回执行实例的操作对象(主要包含执行状态、实例ID这类元数据),而不是直接返回包生成的业务结果。下面给你一步步的解决方案:
第一步:提取执行实例ID
首先,$actualVal其实是一个Operation对象,里面的Id属性就是这次包执行的唯一实例ID,我们需要用它来定位对应的结果集:
# 从执行结果中提取实例ID $executionId = $actualVal.Id Write-Host "当前SSIS包执行实例ID: $executionId"
第二步:通过SSISDB系统视图查询结果集
SSIS会把包执行的所有元数据和结果集都存在SSISDB数据库的系统视图里。我们可以写SQL查询,关联这些视图来提取业务结果集。这里给你一个通用的查询脚本,能拿到所有返回的结果集数据:
# 构建查询语句,提取指定执行实例的结果集 $sqlQuery = @" SELECT rs.result_set_id AS 结果集ID, rsc.name AS 列名, rsr.value AS 列值 FROM [SSISDB].[catalog].[executions] e INNER JOIN [SSISDB].[catalog].[execution_result_sets] rs ON e.execution_id = rs.execution_id INNER JOIN [SSISDB].[catalog].[result_set_columns] rsc ON rs.result_set_id = rsc.result_set_id INNER JOIN [SSISDB].[catalog].[execution_result_set_rows] rsr ON rs.execution_id = rsr.execution_id AND rsc.column_id = rsr.column_id WHERE e.execution_id = $executionId ORDER BY rs.result_set_id, rsc.column_id "@ # 执行查询并加载结果到DataTable $sqlCmd = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConn) $sqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($sqlCmd) $resultTable = New-Object System.Data.DataTable $sqlAdapter.Fill($resultTable) # 输出结果集 Write-Host "成功获取SSIS包执行结果集:" $resultTable | Format-Table -AutoSize
关键注意点
- 确保你的SSIS包已经配置了返回结果集:比如在包内使用「执行SQL任务」时,要将结果集设置为「完整结果集」并映射到合适的变量,或者包通过脚本任务等方式输出结果到执行上下文。如果包本身没有输出结果集,那上面的查询也拿不到数据。
- 可以先通过
$actualVal.Status判断包执行状态:比如值为Succeeded表示执行正常,Failed则表示执行失败,这时候可以先排查包的执行错误,再去拿结果集。
内容的提问来源于stack exchange,提问作者oRoberto
相关产品推荐
相关产品推荐

