You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:15:20