如何使用C#脚本任务调用指定命令行运行SSIS包
SSIS 脚本任务调用dtexec失败问题修复
你的代码存在6个直接导致包未实际运行的错误:
- 参数格式错误:所有dtexec参数的斜杠与参数名之间多了多余空格(比如错写为
/ SERVER、/ X86),dtexec无法识别这类非法参数,直接启动失败。 - 包路径拼接错误:包路径中插入了多余的半角引号,且路径格式不符合SSIS存储包的路径规范,
/SQL参数无法定位到目标包。 - 未等待进程执行、未判断执行结果:仅调用
Process.Start就直接结束方法,既没有等待dtexec进程完成执行,也没有捕获进程启动失败、包执行报错的场景。 - 未设置脚本任务返回值:代码全程未给
Dts.TaskResult赋值,脚本任务默认返回成功状态,和dtexec的实际执行结果完全脱钩。 - 冗余无效代码:单独存在一行无赋值的
Dts.Variables["SSIS_SERVER"].Value.ToString();语句,无任何实际作用。 - 未指定dtexec完整路径:系统默认环境变量指向的dtexec版本可能和你需要的32位版本不符,甚至可能出现找不到执行文件的问题。
修正后代码(严格使用dtexec命令行调用方式)
using System; using System.Data; using Microsoft.SqlServer.Dts.Runtime; using System.Windows.Forms; using System.Collections.Generic; using System.Data.OleDb; using System.Threading; using System.Diagnostics; namespace blablabla.csproj { [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute] public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase { #region VSTA generated code enum ScriptResults { Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success, Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure }; #endregion public void Main() { // 读取变量 string targetServerName = Dts.Variables["SSIS_SERVER"].Value.ToString(); // 替换为实际包路径,格式为\文件夹名\包名,不需要额外加引号、不需要加.dtsx后缀 string packagePath = @"\package_folder\package_name"; ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.WindowStyle = ProcessWindowStyle.Hidden; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.CreateNoWindow = true; // 32位dtexec默认路径,根据SQL Server版本修改路径中的版本号: // SQL Server 2016:130, 2017:140, 2019:150, 2022:160 startInfo.FileName = @"C:\Program Files (x86)\Microsoft SQL Server\150\DTS\Binn\dtexec.exe"; // 拼接正确格式参数,斜杠后直接跟参数名,无空格,自动处理路径含空格的转义 string arguments = $@"/SQL ""{packagePath}"" /SERVER {targetServerName} /X86 /CHECKPOINTING OFF /REPORTING E"; startInfo.Arguments = arguments; try { // 启动进程 using (Process proc = Process.Start(startInfo)) { // 读取执行日志,可输出到SSIS日志排查问题 string output = proc.StandardOutput.ReadToEnd(); string error = proc.StandardError.ReadToEnd(); // 等待进程执行完成,超时时间默认10分钟,可按需调整 proc.WaitForExit(600000); // dtexec返回退出码0代表执行成功 if (proc.ExitCode == 0) { Dts.TaskResult = (int)ScriptResults.Success; } else { Dts.Events.FireError(0, "SSIS包调用", $"执行失败,退出码{proc.ExitCode},错误信息:{error}", string.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; } } } catch (Exception ex) { Dts.Events.FireError(0, "dtexec进程启动失败", ex.Message, string.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; } } } }
配置说明
- 请根据实际安装的SQL Server版本,修改
startInfo.FileName里的dtexec完整路径,确保调用的是对应版本的32位执行程序。 - 把代码里的
packagePath替换为实际的SSIS包存储路径,多层文件夹按\一级目录\二级目录\包名格式填写即可。 - 路径、服务器名包含空格时,上述代码的引号转义逻辑已经做了兼容,不需要额外修改。
内容的提问来源于stack exchange,提问作者igdc
相关产品推荐
相关产品推荐

