在SSIS中使用多个连接字符串

在SSIS中使用多个连接字符串,ssis,Ssis,这是我关于stackoverflow的第一个问题,我希望能尽快找到答案。 我需要创建一个包(SSIS),从一个源提取数据,然后过滤数据并将其推送到多个服务器。因此,我尝试使用executesql任务查询连接字符串,然后在每个连接上使用Foreach循环容器循环。我是根据[shree-pat18]提出的建议来做这件事的(这就解释了一切) 但其中一个主要问题是,大多数时候网站的连接都很糟糕。因此,我希望在继续下一步之前确保连接正常。如果连接速度慢或离线,我希望跳过该站点,并跳转到下一个迭代,跳过所有

这是我关于stackoverflow的第一个问题,我希望能尽快找到答案。 我需要创建一个包(SSIS),从一个源提取数据,然后过滤数据并将其推送到多个服务器。因此,我尝试使用executesql任务查询连接字符串,然后在每个连接上使用Foreach循环容器循环。我是根据[shree-pat18]提出的建议来做这件事的(这就解释了一切)

但其中一个主要问题是,大多数时候网站的连接都很糟糕。因此,我希望在继续下一步之前确保连接正常。如果连接速度慢或离线,我希望跳过该站点,并跳转到下一个迭代,跳过所有其他任务。
如果有人有更好的解决方案,我愿意接受建议,提前谢谢

欢迎来到stackoverflow

我看到您使用脚本任务作为每个循环容器的的第一步

想法 我不知道你在这个脚本任务中到底在做什么,但我建议你更新它,以检查与站点的连接是否正常工作,是否足够快,符合你的要求

拟议的解决办法 我假设您正在使用C#作为脚本语言

  • 在包级别将isSiteLive变量创建为值为False的布尔值
  • 使用脚本任务编辑器将其设置为脚本任务中的ReadWriteVariables:
  • 然后,将脚本更新为ping远程站点,以检查它是否处于活动状态。您还可以根据需要设置可接受的超时
  • 您可以使用以下代码:

    public static bool PingHost(string nameOrAddress, int timeout)
     {
        bool pingable = false;
        Ping pinger = new Ping();
    
        try
        {
            PingReply reply = pinger.Send(nameOrAddress, timeout);
    
            pingable = reply.Status == IPStatus.Success;
        }
        catch (PingException)
        {
            // Discard PingExceptions and return false;
        }
    
        return pingable;
     }
    
  • 如果站点可ping,则将isSiteLive变量设置为True,如果不可ping,则将其设置为False
  • 回到SSIS控制流,双击脚本任务后的链接以添加约束,选择表达式作为求值操作,并将@[User::isSiteLive]作为表达式:
  • 因此,如果站点关闭或响应时间过长,循环将忽略下一个任务

  • 希望这能有所帮助。

    我几乎在我编写的每个包中都使用了一个名为VerifyConnections的脚本任务。我很久以前就发现了这段代码,不记得它的来源,所以我不能相信作者。 它迭代包中的中的所有连接,创建连接,并将结果写入日志。它发现它在开发和测试期间非常有用。您可以轻松地更改代码或将其与Sam的建议相结合,以便它满足您的需要

    using System;
    using System.Data;
    using Microsoft.SqlServer.Dts.Runtime;
    using System.Windows.Forms;
    
    namespace VerifyConnectionsScript
    {
      [System.AddIn.AddIn("ScriptMain", Version="1.0", Publisher="", Description="")]
      public partial class ScriptMain :
              Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
      {
        enum ScriptResults
        {
          Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
          Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        public void Main()
        {
          bool failure = false;
          bool fireAgain = true;
          foreach (var ConnMgr in Dts.Connections) {
            Dts.Events.FireInformation(1, "", String.Format("ConnectionManager='{0}', 
                ConnectionString='{1}'", ConnMgr.Name, ConnMgr.ConnectionString), "", 0, 
                ref fireAgain);
            try {
              ConnMgr.AcquireConnection(null);
              Dts.Events.FireInformation(1, "", 
                   String.Format("Connection acquired successfully on '{0}'", 
                     ConnMgr.Name), "", 0, ref fireAgain);
              }
              catch (Exception ex) {
                Dts.Events.FireError(-1, "", 
                String.Format("Failed to acquire connection to '{0}'. Error ='{1}'", 
                         ConnMgr.Name, ex.Message), "", 0);
                Exception iex = ex.InnerException;
                while (iex != null) {
                  Dts.Events.FireError(-1, "", 
                  String.Format("Inner exception message='{0}'", iex.Message), "", 0);
                  iex = iex.InnerException;
                }
                failure = true;
              }
            }
            if (failure)
              Dts.TaskResult = (int)ScriptResults.Failure;
            else
              Dts.TaskResult = (int)ScriptResults.Success;
          }
       }
    }
    

    让我试试,我会让你知道的。感谢您的快速回复[@Sam]