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

如何在SSIS脚本任务的静态方法中访问DTS变量?

SSIS脚本任务静态方法访问变量的修正方案

问题根源

C#里静态方法属于类本身,不属于类的实例对象,所以没法直接访问非静态的Dts对象,也不能直接使用Main方法里的局部变量。你之前在静态方法里调用Dts.Variables报错,就是因为Dts是脚本任务类的实例成员,静态方法无权直接访问。

修正方法(两种可选)

方法1:将变量作为参数传入静态方法

这是最直接的方式,在Main方法里先获取所有变量值,然后调用静态方法时把这些值传进去,静态方法用参数构建连接字符串即可。

示例代码:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Data.SqlClient;

namespace ST_xxxxxxxxx
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        public void Main()
        {
            // 1. 在Main中获取SSIS变量值
            string sourceServer = Dts.Variables["SourceServer"].Value.ToString();
            string sourceDB = Dts.Variables["SourceDatabase"].Value.ToString();
            string destServer = Dts.Variables["DestinationServer"].Value.ToString();
            string destDB = Dts.Variables["DestinationDatabase"].Value.ToString();

            // 2. 调用静态方法,传入变量参数
            CopySQLTable(sourceServer, sourceDB, destServer, destDB);

            Dts.TaskResult = (int)ScriptResults.Success;
        }

        // 3. 修改静态方法,添加参数接收变量值
        private static void CopySQLTable(string sourceServer, string sourceDB, string destServer, string destDB)
        {
            // 用参数构建源/目标连接字符串
            string sourceConnStr = $"Server={sourceServer};Database={sourceDB};Integrated Security=True;";
            string destConnStr = $"Server={destServer};Database={destDB};Integrated Security=True;";

            // 数据复制逻辑示例(按需替换表名和查询)
            using (SqlConnection sourceConn = new SqlConnection(sourceConnStr))
            {
                sourceConn.Open();
                string query = "SELECT * FROM YourSourceTable";
                using (SqlCommand cmd = new SqlCommand(query, sourceConn))
                using (SqlDataReader reader = cmd.ExecuteReader())
                using (SqlConnection destConn = new SqlConnection(destConnStr))
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destConn))
                {
                    destConn.Open();
                    bulkCopy.DestinationTableName = "YourDestinationTable";
                    bulkCopy.WriteToServer(reader);
                }
            }
        }

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        }
    }
}

方法2:将静态方法改为实例方法

如果不想传参数,可以把CopySQLTable改成非静态方法(去掉static关键字),这样方法里可以直接访问类的成员变量,或者直接调用Dts.Variables(推荐先把变量存到类成员里,避免多次访问Dts)。

示例代码:

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Data.SqlClient;

namespace ST_xxxxxxxxx
{
    [Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        // 定义类成员变量存储服务器/数据库名
        private string _sourceServer;
        private string _sourceDB;
        private string _destServer;
        private string _destDB;

        public void Main()
        {
            // 1. 将SSIS变量值存入类成员
            _sourceServer = Dts.Variables["SourceServer"].Value.ToString();
            _sourceDB = Dts.Variables["SourceDatabase"].Value.ToString();
            _destServer = Dts.Variables["DestinationServer"].Value.ToString();
            _destDB = Dts.Variables["DestinationDatabase"].Value.ToString();

            // 2. 调用实例方法(无需传参)
            CopySQLTable();

            Dts.TaskResult = (int)ScriptResults.Success;
        }

        // 3. 去掉static关键字,改为实例方法
        private void CopySQLTable()
        {
            // 使用类成员变量构建连接字符串
            string sourceConnStr = $"Server={_sourceServer};Database={_sourceDB};Integrated Security=True;";
            string destConnStr = $"Server={_destServer};Database={_destDB};Integrated Security=True;";

            // 数据复制逻辑示例(按需替换表名和查询)
            using (SqlConnection sourceConn = new SqlConnection(sourceConnStr))
            {
                sourceConn.Open();
                string query = "SELECT * FROM YourSourceTable";
                using (SqlCommand cmd = new SqlCommand(query, sourceConn))
                using (SqlDataReader reader = cmd.ExecuteReader())
                using (SqlConnection destConn = new SqlConnection(destConnStr))
                using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destConn))
                {
                    destConn.Open();
                    bulkCopy.DestinationTableName = "YourDestinationTable";
                    bulkCopy.WriteToServer(reader);
                }
            }
        }

        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        }
    }
}

注意事项

  • 替换代码中的YourSourceTable和YourDestinationTable为实际表名
  • 若使用SQL身份验证,将连接字符串改为Server={server};Database={db};User ID={user};Password={pwd};,可新增SSIS变量存储账号密码
  • 确保脚本任务已勾选四个变量的ReadOnly权限(在脚本任务编辑器的「脚本」选项卡,点击「编辑脚本」旁的「变量」按钮,选中目标变量)

内容的提问来源于stack exchange,提问作者Nish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:23:16